فهرست منبع

Move to protobufjs, more tests, add LeaderUnset event

Leszek Wiesner 3 سال پیش
والد
کامیت
1bfe24ed72
38فایلهای تغییر یافته به همراه4254 افزوده شده و 3566 حذف شده
  1. 10 9
      metadata-protobuf/compile.sh
  2. 1119 0
      metadata-protobuf/compiled/index.d.ts
  3. 2669 0
      metadata-protobuf/compiled/index.js
  4. 0 45
      metadata-protobuf/compiled/proto/Council_pb.d.ts
  5. 0 340
      metadata-protobuf/compiled/proto/Council_pb.js
  6. 0 39
      metadata-protobuf/compiled/proto/Membership_pb.d.ts
  7. 0 284
      metadata-protobuf/compiled/proto/Membership_pb.js
  8. 0 302
      metadata-protobuf/compiled/proto/WorkingGroups_pb.d.ts
  9. 0 2295
      metadata-protobuf/compiled/proto/WorkingGroups_pb.js
  10. 5 3
      metadata-protobuf/package.json
  11. 2 2
      metadata-protobuf/proto/WorkingGroups.proto
  12. 1 3
      metadata-protobuf/src/index.ts
  13. 11 4
      query-node/mappings/common.ts
  14. 11 19
      query-node/mappings/membership.ts
  15. 54 57
      query-node/mappings/workingGroups.ts
  16. 3 0
      query-node/schemas/workingGroupsEvents.graphql
  17. 6 5
      tests/integration-tests/src/Api.ts
  18. 3 2
      tests/integration-tests/src/Fixture.ts
  19. 13 0
      tests/integration-tests/src/QueryNodeApi.ts
  20. 8 5
      tests/integration-tests/src/fixtures/membership/BaseMembershipFixture.ts
  21. 7 6
      tests/integration-tests/src/fixtures/membership/BuyMembershipHappyCaseFixture.ts
  22. 9 8
      tests/integration-tests/src/fixtures/membership/InviteMembersHappyCaseFixture.ts
  23. 6 4
      tests/integration-tests/src/fixtures/membership/UpdateProfileHappyCaseFixture.ts
  24. 10 10
      tests/integration-tests/src/fixtures/workingGroups/ApplyOnOpeningsHappyCaseFixture.ts
  25. 57 30
      tests/integration-tests/src/fixtures/workingGroups/BaseCreateOpeningFixture.ts
  26. 6 2
      tests/integration-tests/src/fixtures/workingGroups/CreateOpeningsFixture.ts
  27. 46 34
      tests/integration-tests/src/fixtures/workingGroups/CreateUpcomingOpeningsFixture.ts
  28. 10 11
      tests/integration-tests/src/fixtures/workingGroups/RemoveUpcomingOpeningsFixture.ts
  29. 25 0
      tests/integration-tests/src/fixtures/workingGroups/TerminateWorkersFixture.ts
  30. 13 26
      tests/integration-tests/src/fixtures/workingGroups/UpdateGroupStatusFixture.ts
  31. 3 6
      tests/integration-tests/src/fixtures/workingGroups/utils.ts
  32. 18 2
      tests/integration-tests/src/flows/working-groups/groupStatus.ts
  33. 22 1
      tests/integration-tests/src/flows/working-groups/upcomingOpenings.ts
  34. 37 0
      tests/integration-tests/src/graphql/generated/queries.ts
  35. 9 0
      tests/integration-tests/src/graphql/generated/schema.ts
  36. 19 1
      tests/integration-tests/src/graphql/queries/workingGroupsEvents.graphql
  37. 16 2
      tests/integration-tests/src/utils.ts
  38. 26 9
      yarn.lock

+ 10 - 9
metadata-protobuf/compile.sh

@@ -1,15 +1,16 @@
 #!/usr/bin/env bash
 
-# Path to this plugin
-PROTOC_GEN_TS_PATH="./node_modules/.bin/protoc-gen-ts"
-
 # Directory to write generated code to (.js and .d.ts files)
 OUT_DIR="./compiled"
 mkdir -p ${OUT_DIR}
 
-# Compile proto files
-protoc \
-    --plugin="protoc-gen-ts=${PROTOC_GEN_TS_PATH}" \
-    --js_out="import_style=commonjs,binary:${OUT_DIR}" \
-    --ts_out="${OUT_DIR}" \
-    proto/*.proto
+yarn pbjs \
+  -t="static-module" \
+  -w="commonjs" \
+  -o="${OUT_DIR}/index.js" \
+  --force-long \
+  proto/*.proto
+
+yarn pbts \
+  -o="${OUT_DIR}/index.d.ts" \
+  ${OUT_DIR}/*.js

+ 1119 - 0
metadata-protobuf/compiled/index.d.ts

@@ -0,0 +1,1119 @@
+import * as $protobuf from "protobufjs";
+/** Properties of a CouncilCandidacyNoteMetadata. */
+export interface ICouncilCandidacyNoteMetadata {
+
+    /** CouncilCandidacyNoteMetadata header */
+    header?: (string|null);
+
+    /** CouncilCandidacyNoteMetadata bulletPoints */
+    bulletPoints?: (string[]|null);
+
+    /** CouncilCandidacyNoteMetadata bannerImageUri */
+    bannerImageUri?: (string|null);
+
+    /** CouncilCandidacyNoteMetadata description */
+    description?: (string|null);
+}
+
+/** Represents a CouncilCandidacyNoteMetadata. */
+export class CouncilCandidacyNoteMetadata implements ICouncilCandidacyNoteMetadata {
+
+    /**
+     * Constructs a new CouncilCandidacyNoteMetadata.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: ICouncilCandidacyNoteMetadata);
+
+    /** CouncilCandidacyNoteMetadata header. */
+    public header: string;
+
+    /** CouncilCandidacyNoteMetadata bulletPoints. */
+    public bulletPoints: string[];
+
+    /** CouncilCandidacyNoteMetadata bannerImageUri. */
+    public bannerImageUri: string;
+
+    /** CouncilCandidacyNoteMetadata description. */
+    public description: string;
+
+    /**
+     * Creates a new CouncilCandidacyNoteMetadata instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns CouncilCandidacyNoteMetadata instance
+     */
+    public static create(properties?: ICouncilCandidacyNoteMetadata): CouncilCandidacyNoteMetadata;
+
+    /**
+     * Encodes the specified CouncilCandidacyNoteMetadata message. Does not implicitly {@link CouncilCandidacyNoteMetadata.verify|verify} messages.
+     * @param message CouncilCandidacyNoteMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: ICouncilCandidacyNoteMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified CouncilCandidacyNoteMetadata message, length delimited. Does not implicitly {@link CouncilCandidacyNoteMetadata.verify|verify} messages.
+     * @param message CouncilCandidacyNoteMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: ICouncilCandidacyNoteMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes a CouncilCandidacyNoteMetadata message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns CouncilCandidacyNoteMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): CouncilCandidacyNoteMetadata;
+
+    /**
+     * Decodes a CouncilCandidacyNoteMetadata message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns CouncilCandidacyNoteMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): CouncilCandidacyNoteMetadata;
+
+    /**
+     * Verifies a CouncilCandidacyNoteMetadata message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates a CouncilCandidacyNoteMetadata message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns CouncilCandidacyNoteMetadata
+     */
+    public static fromObject(object: { [k: string]: any }): CouncilCandidacyNoteMetadata;
+
+    /**
+     * Creates a plain object from a CouncilCandidacyNoteMetadata message. Also converts values to other types if specified.
+     * @param message CouncilCandidacyNoteMetadata
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: CouncilCandidacyNoteMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this CouncilCandidacyNoteMetadata to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}
+
+/** Properties of a MembershipMetadata. */
+export interface IMembershipMetadata {
+
+    /** MembershipMetadata name */
+    name?: (string|null);
+
+    /** MembershipMetadata avatar */
+    avatar?: (number|null);
+
+    /** MembershipMetadata about */
+    about?: (string|null);
+}
+
+/** Represents a MembershipMetadata. */
+export class MembershipMetadata implements IMembershipMetadata {
+
+    /**
+     * Constructs a new MembershipMetadata.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: IMembershipMetadata);
+
+    /** MembershipMetadata name. */
+    public name: string;
+
+    /** MembershipMetadata avatar. */
+    public avatar: number;
+
+    /** MembershipMetadata about. */
+    public about: string;
+
+    /**
+     * Creates a new MembershipMetadata instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns MembershipMetadata instance
+     */
+    public static create(properties?: IMembershipMetadata): MembershipMetadata;
+
+    /**
+     * Encodes the specified MembershipMetadata message. Does not implicitly {@link MembershipMetadata.verify|verify} messages.
+     * @param message MembershipMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: IMembershipMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified MembershipMetadata message, length delimited. Does not implicitly {@link MembershipMetadata.verify|verify} messages.
+     * @param message MembershipMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: IMembershipMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes a MembershipMetadata message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns MembershipMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): MembershipMetadata;
+
+    /**
+     * Decodes a MembershipMetadata message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns MembershipMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): MembershipMetadata;
+
+    /**
+     * Verifies a MembershipMetadata message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates a MembershipMetadata message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns MembershipMetadata
+     */
+    public static fromObject(object: { [k: string]: any }): MembershipMetadata;
+
+    /**
+     * Creates a plain object from a MembershipMetadata message. Also converts values to other types if specified.
+     * @param message MembershipMetadata
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: MembershipMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this MembershipMetadata to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}
+
+/** Properties of an OpeningMetadata. */
+export interface IOpeningMetadata {
+
+    /** OpeningMetadata shortDescription */
+    shortDescription: string;
+
+    /** OpeningMetadata description */
+    description: string;
+
+    /** OpeningMetadata hiringLimit */
+    hiringLimit?: (number|null);
+
+    /** OpeningMetadata expectedEndingTimestamp */
+    expectedEndingTimestamp?: (number|null);
+
+    /** OpeningMetadata applicationDetails */
+    applicationDetails: string;
+
+    /** OpeningMetadata applicationFormQuestions */
+    applicationFormQuestions?: (OpeningMetadata.IApplicationFormQuestion[]|null);
+}
+
+/** Represents an OpeningMetadata. */
+export class OpeningMetadata implements IOpeningMetadata {
+
+    /**
+     * Constructs a new OpeningMetadata.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: IOpeningMetadata);
+
+    /** OpeningMetadata shortDescription. */
+    public shortDescription: string;
+
+    /** OpeningMetadata description. */
+    public description: string;
+
+    /** OpeningMetadata hiringLimit. */
+    public hiringLimit: number;
+
+    /** OpeningMetadata expectedEndingTimestamp. */
+    public expectedEndingTimestamp: number;
+
+    /** OpeningMetadata applicationDetails. */
+    public applicationDetails: string;
+
+    /** OpeningMetadata applicationFormQuestions. */
+    public applicationFormQuestions: OpeningMetadata.IApplicationFormQuestion[];
+
+    /**
+     * Creates a new OpeningMetadata instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns OpeningMetadata instance
+     */
+    public static create(properties?: IOpeningMetadata): OpeningMetadata;
+
+    /**
+     * Encodes the specified OpeningMetadata message. Does not implicitly {@link OpeningMetadata.verify|verify} messages.
+     * @param message OpeningMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: IOpeningMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified OpeningMetadata message, length delimited. Does not implicitly {@link OpeningMetadata.verify|verify} messages.
+     * @param message OpeningMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: IOpeningMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes an OpeningMetadata message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns OpeningMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): OpeningMetadata;
+
+    /**
+     * Decodes an OpeningMetadata message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns OpeningMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): OpeningMetadata;
+
+    /**
+     * Verifies an OpeningMetadata message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates an OpeningMetadata message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns OpeningMetadata
+     */
+    public static fromObject(object: { [k: string]: any }): OpeningMetadata;
+
+    /**
+     * Creates a plain object from an OpeningMetadata message. Also converts values to other types if specified.
+     * @param message OpeningMetadata
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: OpeningMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this OpeningMetadata to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}
+
+export namespace OpeningMetadata {
+
+    /** Properties of an ApplicationFormQuestion. */
+    interface IApplicationFormQuestion {
+
+        /** ApplicationFormQuestion question */
+        question: string;
+
+        /** ApplicationFormQuestion type */
+        type: OpeningMetadata.ApplicationFormQuestion.InputType;
+    }
+
+    /** Represents an ApplicationFormQuestion. */
+    class ApplicationFormQuestion implements IApplicationFormQuestion {
+
+        /**
+         * Constructs a new ApplicationFormQuestion.
+         * @param [properties] Properties to set
+         */
+        constructor(properties?: OpeningMetadata.IApplicationFormQuestion);
+
+        /** ApplicationFormQuestion question. */
+        public question: string;
+
+        /** ApplicationFormQuestion type. */
+        public type: OpeningMetadata.ApplicationFormQuestion.InputType;
+
+        /**
+         * Creates a new ApplicationFormQuestion instance using the specified properties.
+         * @param [properties] Properties to set
+         * @returns ApplicationFormQuestion instance
+         */
+        public static create(properties?: OpeningMetadata.IApplicationFormQuestion): OpeningMetadata.ApplicationFormQuestion;
+
+        /**
+         * Encodes the specified ApplicationFormQuestion message. Does not implicitly {@link OpeningMetadata.ApplicationFormQuestion.verify|verify} messages.
+         * @param message ApplicationFormQuestion message or plain object to encode
+         * @param [writer] Writer to encode to
+         * @returns Writer
+         */
+        public static encode(message: OpeningMetadata.IApplicationFormQuestion, writer?: $protobuf.Writer): $protobuf.Writer;
+
+        /**
+         * Encodes the specified ApplicationFormQuestion message, length delimited. Does not implicitly {@link OpeningMetadata.ApplicationFormQuestion.verify|verify} messages.
+         * @param message ApplicationFormQuestion message or plain object to encode
+         * @param [writer] Writer to encode to
+         * @returns Writer
+         */
+        public static encodeDelimited(message: OpeningMetadata.IApplicationFormQuestion, writer?: $protobuf.Writer): $protobuf.Writer;
+
+        /**
+         * Decodes an ApplicationFormQuestion message from the specified reader or buffer.
+         * @param reader Reader or buffer to decode from
+         * @param [length] Message length if known beforehand
+         * @returns ApplicationFormQuestion
+         * @throws {Error} If the payload is not a reader or valid buffer
+         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+         */
+        public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): OpeningMetadata.ApplicationFormQuestion;
+
+        /**
+         * Decodes an ApplicationFormQuestion message from the specified reader or buffer, length delimited.
+         * @param reader Reader or buffer to decode from
+         * @returns ApplicationFormQuestion
+         * @throws {Error} If the payload is not a reader or valid buffer
+         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+         */
+        public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): OpeningMetadata.ApplicationFormQuestion;
+
+        /**
+         * Verifies an ApplicationFormQuestion message.
+         * @param message Plain object to verify
+         * @returns `null` if valid, otherwise the reason why it is not
+         */
+        public static verify(message: { [k: string]: any }): (string|null);
+
+        /**
+         * Creates an ApplicationFormQuestion message from a plain object. Also converts values to their respective internal types.
+         * @param object Plain object
+         * @returns ApplicationFormQuestion
+         */
+        public static fromObject(object: { [k: string]: any }): OpeningMetadata.ApplicationFormQuestion;
+
+        /**
+         * Creates a plain object from an ApplicationFormQuestion message. Also converts values to other types if specified.
+         * @param message ApplicationFormQuestion
+         * @param [options] Conversion options
+         * @returns Plain object
+         */
+        public static toObject(message: OpeningMetadata.ApplicationFormQuestion, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+        /**
+         * Converts this ApplicationFormQuestion to JSON.
+         * @returns JSON object
+         */
+        public toJSON(): { [k: string]: any };
+    }
+
+    namespace ApplicationFormQuestion {
+
+        /** InputType enum. */
+        enum InputType {
+            TEXT = 1,
+            TEXTAREA = 2
+        }
+    }
+}
+
+/** Properties of an UpcomingOpeningMetadata. */
+export interface IUpcomingOpeningMetadata {
+
+    /** UpcomingOpeningMetadata expectedStart */
+    expectedStart: number;
+
+    /** UpcomingOpeningMetadata rewardPerBlock */
+    rewardPerBlock: Long;
+
+    /** UpcomingOpeningMetadata minApplicationStake */
+    minApplicationStake: Long;
+
+    /** UpcomingOpeningMetadata metadata */
+    metadata: IOpeningMetadata;
+}
+
+/** Represents an UpcomingOpeningMetadata. */
+export class UpcomingOpeningMetadata implements IUpcomingOpeningMetadata {
+
+    /**
+     * Constructs a new UpcomingOpeningMetadata.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: IUpcomingOpeningMetadata);
+
+    /** UpcomingOpeningMetadata expectedStart. */
+    public expectedStart: number;
+
+    /** UpcomingOpeningMetadata rewardPerBlock. */
+    public rewardPerBlock: Long;
+
+    /** UpcomingOpeningMetadata minApplicationStake. */
+    public minApplicationStake: Long;
+
+    /** UpcomingOpeningMetadata metadata. */
+    public metadata: IOpeningMetadata;
+
+    /**
+     * Creates a new UpcomingOpeningMetadata instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns UpcomingOpeningMetadata instance
+     */
+    public static create(properties?: IUpcomingOpeningMetadata): UpcomingOpeningMetadata;
+
+    /**
+     * Encodes the specified UpcomingOpeningMetadata message. Does not implicitly {@link UpcomingOpeningMetadata.verify|verify} messages.
+     * @param message UpcomingOpeningMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: IUpcomingOpeningMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified UpcomingOpeningMetadata message, length delimited. Does not implicitly {@link UpcomingOpeningMetadata.verify|verify} messages.
+     * @param message UpcomingOpeningMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: IUpcomingOpeningMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes an UpcomingOpeningMetadata message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns UpcomingOpeningMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): UpcomingOpeningMetadata;
+
+    /**
+     * Decodes an UpcomingOpeningMetadata message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns UpcomingOpeningMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): UpcomingOpeningMetadata;
+
+    /**
+     * Verifies an UpcomingOpeningMetadata message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates an UpcomingOpeningMetadata message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns UpcomingOpeningMetadata
+     */
+    public static fromObject(object: { [k: string]: any }): UpcomingOpeningMetadata;
+
+    /**
+     * Creates a plain object from an UpcomingOpeningMetadata message. Also converts values to other types if specified.
+     * @param message UpcomingOpeningMetadata
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: UpcomingOpeningMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this UpcomingOpeningMetadata to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}
+
+/** Properties of an ApplicationMetadata. */
+export interface IApplicationMetadata {
+
+    /** ApplicationMetadata answers */
+    answers?: (string[]|null);
+}
+
+/** Represents an ApplicationMetadata. */
+export class ApplicationMetadata implements IApplicationMetadata {
+
+    /**
+     * Constructs a new ApplicationMetadata.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: IApplicationMetadata);
+
+    /** ApplicationMetadata answers. */
+    public answers: string[];
+
+    /**
+     * Creates a new ApplicationMetadata instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns ApplicationMetadata instance
+     */
+    public static create(properties?: IApplicationMetadata): ApplicationMetadata;
+
+    /**
+     * Encodes the specified ApplicationMetadata message. Does not implicitly {@link ApplicationMetadata.verify|verify} messages.
+     * @param message ApplicationMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: IApplicationMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified ApplicationMetadata message, length delimited. Does not implicitly {@link ApplicationMetadata.verify|verify} messages.
+     * @param message ApplicationMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: IApplicationMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes an ApplicationMetadata message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns ApplicationMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): ApplicationMetadata;
+
+    /**
+     * Decodes an ApplicationMetadata message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns ApplicationMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): ApplicationMetadata;
+
+    /**
+     * Verifies an ApplicationMetadata message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates an ApplicationMetadata message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns ApplicationMetadata
+     */
+    public static fromObject(object: { [k: string]: any }): ApplicationMetadata;
+
+    /**
+     * Creates a plain object from an ApplicationMetadata message. Also converts values to other types if specified.
+     * @param message ApplicationMetadata
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: ApplicationMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this ApplicationMetadata to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}
+
+/** Properties of a WorkingGroupMetadata. */
+export interface IWorkingGroupMetadata {
+
+    /** WorkingGroupMetadata description */
+    description?: (string|null);
+
+    /** WorkingGroupMetadata about */
+    about?: (string|null);
+
+    /** WorkingGroupMetadata status */
+    status?: (string|null);
+
+    /** WorkingGroupMetadata statusMessage */
+    statusMessage?: (string|null);
+}
+
+/** Represents a WorkingGroupMetadata. */
+export class WorkingGroupMetadata implements IWorkingGroupMetadata {
+
+    /**
+     * Constructs a new WorkingGroupMetadata.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: IWorkingGroupMetadata);
+
+    /** WorkingGroupMetadata description. */
+    public description: string;
+
+    /** WorkingGroupMetadata about. */
+    public about: string;
+
+    /** WorkingGroupMetadata status. */
+    public status: string;
+
+    /** WorkingGroupMetadata statusMessage. */
+    public statusMessage: string;
+
+    /**
+     * Creates a new WorkingGroupMetadata instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns WorkingGroupMetadata instance
+     */
+    public static create(properties?: IWorkingGroupMetadata): WorkingGroupMetadata;
+
+    /**
+     * Encodes the specified WorkingGroupMetadata message. Does not implicitly {@link WorkingGroupMetadata.verify|verify} messages.
+     * @param message WorkingGroupMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: IWorkingGroupMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified WorkingGroupMetadata message, length delimited. Does not implicitly {@link WorkingGroupMetadata.verify|verify} messages.
+     * @param message WorkingGroupMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: IWorkingGroupMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes a WorkingGroupMetadata message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns WorkingGroupMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): WorkingGroupMetadata;
+
+    /**
+     * Decodes a WorkingGroupMetadata message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns WorkingGroupMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): WorkingGroupMetadata;
+
+    /**
+     * Verifies a WorkingGroupMetadata message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates a WorkingGroupMetadata message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns WorkingGroupMetadata
+     */
+    public static fromObject(object: { [k: string]: any }): WorkingGroupMetadata;
+
+    /**
+     * Creates a plain object from a WorkingGroupMetadata message. Also converts values to other types if specified.
+     * @param message WorkingGroupMetadata
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: WorkingGroupMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this WorkingGroupMetadata to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}
+
+/** Properties of a SetGroupMetadata. */
+export interface ISetGroupMetadata {
+
+    /** SetGroupMetadata newMetadata */
+    newMetadata: IWorkingGroupMetadata;
+}
+
+/** Represents a SetGroupMetadata. */
+export class SetGroupMetadata implements ISetGroupMetadata {
+
+    /**
+     * Constructs a new SetGroupMetadata.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: ISetGroupMetadata);
+
+    /** SetGroupMetadata newMetadata. */
+    public newMetadata: IWorkingGroupMetadata;
+
+    /**
+     * Creates a new SetGroupMetadata instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns SetGroupMetadata instance
+     */
+    public static create(properties?: ISetGroupMetadata): SetGroupMetadata;
+
+    /**
+     * Encodes the specified SetGroupMetadata message. Does not implicitly {@link SetGroupMetadata.verify|verify} messages.
+     * @param message SetGroupMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: ISetGroupMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified SetGroupMetadata message, length delimited. Does not implicitly {@link SetGroupMetadata.verify|verify} messages.
+     * @param message SetGroupMetadata message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: ISetGroupMetadata, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes a SetGroupMetadata message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns SetGroupMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): SetGroupMetadata;
+
+    /**
+     * Decodes a SetGroupMetadata message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns SetGroupMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): SetGroupMetadata;
+
+    /**
+     * Verifies a SetGroupMetadata message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates a SetGroupMetadata message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns SetGroupMetadata
+     */
+    public static fromObject(object: { [k: string]: any }): SetGroupMetadata;
+
+    /**
+     * Creates a plain object from a SetGroupMetadata message. Also converts values to other types if specified.
+     * @param message SetGroupMetadata
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: SetGroupMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this SetGroupMetadata to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}
+
+/** Properties of an AddUpcomingOpening. */
+export interface IAddUpcomingOpening {
+
+    /** AddUpcomingOpening metadata */
+    metadata: IUpcomingOpeningMetadata;
+}
+
+/** Represents an AddUpcomingOpening. */
+export class AddUpcomingOpening implements IAddUpcomingOpening {
+
+    /**
+     * Constructs a new AddUpcomingOpening.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: IAddUpcomingOpening);
+
+    /** AddUpcomingOpening metadata. */
+    public metadata: IUpcomingOpeningMetadata;
+
+    /**
+     * Creates a new AddUpcomingOpening instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns AddUpcomingOpening instance
+     */
+    public static create(properties?: IAddUpcomingOpening): AddUpcomingOpening;
+
+    /**
+     * Encodes the specified AddUpcomingOpening message. Does not implicitly {@link AddUpcomingOpening.verify|verify} messages.
+     * @param message AddUpcomingOpening message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: IAddUpcomingOpening, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified AddUpcomingOpening message, length delimited. Does not implicitly {@link AddUpcomingOpening.verify|verify} messages.
+     * @param message AddUpcomingOpening message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: IAddUpcomingOpening, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes an AddUpcomingOpening message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns AddUpcomingOpening
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): AddUpcomingOpening;
+
+    /**
+     * Decodes an AddUpcomingOpening message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns AddUpcomingOpening
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): AddUpcomingOpening;
+
+    /**
+     * Verifies an AddUpcomingOpening message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates an AddUpcomingOpening message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns AddUpcomingOpening
+     */
+    public static fromObject(object: { [k: string]: any }): AddUpcomingOpening;
+
+    /**
+     * Creates a plain object from an AddUpcomingOpening message. Also converts values to other types if specified.
+     * @param message AddUpcomingOpening
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: AddUpcomingOpening, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this AddUpcomingOpening to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}
+
+/** Properties of a RemoveUpcomingOpening. */
+export interface IRemoveUpcomingOpening {
+
+    /** RemoveUpcomingOpening id */
+    id: string;
+}
+
+/** Represents a RemoveUpcomingOpening. */
+export class RemoveUpcomingOpening implements IRemoveUpcomingOpening {
+
+    /**
+     * Constructs a new RemoveUpcomingOpening.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: IRemoveUpcomingOpening);
+
+    /** RemoveUpcomingOpening id. */
+    public id: string;
+
+    /**
+     * Creates a new RemoveUpcomingOpening instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns RemoveUpcomingOpening instance
+     */
+    public static create(properties?: IRemoveUpcomingOpening): RemoveUpcomingOpening;
+
+    /**
+     * Encodes the specified RemoveUpcomingOpening message. Does not implicitly {@link RemoveUpcomingOpening.verify|verify} messages.
+     * @param message RemoveUpcomingOpening message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: IRemoveUpcomingOpening, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified RemoveUpcomingOpening message, length delimited. Does not implicitly {@link RemoveUpcomingOpening.verify|verify} messages.
+     * @param message RemoveUpcomingOpening message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: IRemoveUpcomingOpening, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes a RemoveUpcomingOpening message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns RemoveUpcomingOpening
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): RemoveUpcomingOpening;
+
+    /**
+     * Decodes a RemoveUpcomingOpening message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns RemoveUpcomingOpening
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): RemoveUpcomingOpening;
+
+    /**
+     * Verifies a RemoveUpcomingOpening message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates a RemoveUpcomingOpening message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns RemoveUpcomingOpening
+     */
+    public static fromObject(object: { [k: string]: any }): RemoveUpcomingOpening;
+
+    /**
+     * Creates a plain object from a RemoveUpcomingOpening message. Also converts values to other types if specified.
+     * @param message RemoveUpcomingOpening
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: RemoveUpcomingOpening, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this RemoveUpcomingOpening to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}
+
+/** Properties of a WorkingGroupMetadataAction. */
+export interface IWorkingGroupMetadataAction {
+
+    /** WorkingGroupMetadataAction setGroupMetadata */
+    setGroupMetadata?: (ISetGroupMetadata|null);
+
+    /** WorkingGroupMetadataAction addUpcomingOpening */
+    addUpcomingOpening?: (IAddUpcomingOpening|null);
+
+    /** WorkingGroupMetadataAction removeUpcomingOpening */
+    removeUpcomingOpening?: (IRemoveUpcomingOpening|null);
+}
+
+/** Represents a WorkingGroupMetadataAction. */
+export class WorkingGroupMetadataAction implements IWorkingGroupMetadataAction {
+
+    /**
+     * Constructs a new WorkingGroupMetadataAction.
+     * @param [properties] Properties to set
+     */
+    constructor(properties?: IWorkingGroupMetadataAction);
+
+    /** WorkingGroupMetadataAction setGroupMetadata. */
+    public setGroupMetadata?: (ISetGroupMetadata|null);
+
+    /** WorkingGroupMetadataAction addUpcomingOpening. */
+    public addUpcomingOpening?: (IAddUpcomingOpening|null);
+
+    /** WorkingGroupMetadataAction removeUpcomingOpening. */
+    public removeUpcomingOpening?: (IRemoveUpcomingOpening|null);
+
+    /** WorkingGroupMetadataAction action. */
+    public action?: ("setGroupMetadata"|"addUpcomingOpening"|"removeUpcomingOpening");
+
+    /**
+     * Creates a new WorkingGroupMetadataAction instance using the specified properties.
+     * @param [properties] Properties to set
+     * @returns WorkingGroupMetadataAction instance
+     */
+    public static create(properties?: IWorkingGroupMetadataAction): WorkingGroupMetadataAction;
+
+    /**
+     * Encodes the specified WorkingGroupMetadataAction message. Does not implicitly {@link WorkingGroupMetadataAction.verify|verify} messages.
+     * @param message WorkingGroupMetadataAction message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encode(message: IWorkingGroupMetadataAction, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Encodes the specified WorkingGroupMetadataAction message, length delimited. Does not implicitly {@link WorkingGroupMetadataAction.verify|verify} messages.
+     * @param message WorkingGroupMetadataAction message or plain object to encode
+     * @param [writer] Writer to encode to
+     * @returns Writer
+     */
+    public static encodeDelimited(message: IWorkingGroupMetadataAction, writer?: $protobuf.Writer): $protobuf.Writer;
+
+    /**
+     * Decodes a WorkingGroupMetadataAction message from the specified reader or buffer.
+     * @param reader Reader or buffer to decode from
+     * @param [length] Message length if known beforehand
+     * @returns WorkingGroupMetadataAction
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): WorkingGroupMetadataAction;
+
+    /**
+     * Decodes a WorkingGroupMetadataAction message from the specified reader or buffer, length delimited.
+     * @param reader Reader or buffer to decode from
+     * @returns WorkingGroupMetadataAction
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): WorkingGroupMetadataAction;
+
+    /**
+     * Verifies a WorkingGroupMetadataAction message.
+     * @param message Plain object to verify
+     * @returns `null` if valid, otherwise the reason why it is not
+     */
+    public static verify(message: { [k: string]: any }): (string|null);
+
+    /**
+     * Creates a WorkingGroupMetadataAction message from a plain object. Also converts values to their respective internal types.
+     * @param object Plain object
+     * @returns WorkingGroupMetadataAction
+     */
+    public static fromObject(object: { [k: string]: any }): WorkingGroupMetadataAction;
+
+    /**
+     * Creates a plain object from a WorkingGroupMetadataAction message. Also converts values to other types if specified.
+     * @param message WorkingGroupMetadataAction
+     * @param [options] Conversion options
+     * @returns Plain object
+     */
+    public static toObject(message: WorkingGroupMetadataAction, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+    /**
+     * Converts this WorkingGroupMetadataAction to JSON.
+     * @returns JSON object
+     */
+    public toJSON(): { [k: string]: any };
+}

+ 2669 - 0
metadata-protobuf/compiled/index.js

@@ -0,0 +1,2669 @@
+/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/
+"use strict";
+
+var $protobuf = require("protobufjs/minimal");
+
+// Common aliases
+var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;
+
+// Exported root namespace
+var $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {});
+
+$root.CouncilCandidacyNoteMetadata = (function() {
+
+    /**
+     * Properties of a CouncilCandidacyNoteMetadata.
+     * @exports ICouncilCandidacyNoteMetadata
+     * @interface ICouncilCandidacyNoteMetadata
+     * @property {string|null} [header] CouncilCandidacyNoteMetadata header
+     * @property {Array.<string>|null} [bulletPoints] CouncilCandidacyNoteMetadata bulletPoints
+     * @property {string|null} [bannerImageUri] CouncilCandidacyNoteMetadata bannerImageUri
+     * @property {string|null} [description] CouncilCandidacyNoteMetadata description
+     */
+
+    /**
+     * Constructs a new CouncilCandidacyNoteMetadata.
+     * @exports CouncilCandidacyNoteMetadata
+     * @classdesc Represents a CouncilCandidacyNoteMetadata.
+     * @implements ICouncilCandidacyNoteMetadata
+     * @constructor
+     * @param {ICouncilCandidacyNoteMetadata=} [properties] Properties to set
+     */
+    function CouncilCandidacyNoteMetadata(properties) {
+        this.bulletPoints = [];
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * CouncilCandidacyNoteMetadata header.
+     * @member {string} header
+     * @memberof CouncilCandidacyNoteMetadata
+     * @instance
+     */
+    CouncilCandidacyNoteMetadata.prototype.header = "";
+
+    /**
+     * CouncilCandidacyNoteMetadata bulletPoints.
+     * @member {Array.<string>} bulletPoints
+     * @memberof CouncilCandidacyNoteMetadata
+     * @instance
+     */
+    CouncilCandidacyNoteMetadata.prototype.bulletPoints = $util.emptyArray;
+
+    /**
+     * CouncilCandidacyNoteMetadata bannerImageUri.
+     * @member {string} bannerImageUri
+     * @memberof CouncilCandidacyNoteMetadata
+     * @instance
+     */
+    CouncilCandidacyNoteMetadata.prototype.bannerImageUri = "";
+
+    /**
+     * CouncilCandidacyNoteMetadata description.
+     * @member {string} description
+     * @memberof CouncilCandidacyNoteMetadata
+     * @instance
+     */
+    CouncilCandidacyNoteMetadata.prototype.description = "";
+
+    /**
+     * Creates a new CouncilCandidacyNoteMetadata instance using the specified properties.
+     * @function create
+     * @memberof CouncilCandidacyNoteMetadata
+     * @static
+     * @param {ICouncilCandidacyNoteMetadata=} [properties] Properties to set
+     * @returns {CouncilCandidacyNoteMetadata} CouncilCandidacyNoteMetadata instance
+     */
+    CouncilCandidacyNoteMetadata.create = function create(properties) {
+        return new CouncilCandidacyNoteMetadata(properties);
+    };
+
+    /**
+     * Encodes the specified CouncilCandidacyNoteMetadata message. Does not implicitly {@link CouncilCandidacyNoteMetadata.verify|verify} messages.
+     * @function encode
+     * @memberof CouncilCandidacyNoteMetadata
+     * @static
+     * @param {ICouncilCandidacyNoteMetadata} message CouncilCandidacyNoteMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    CouncilCandidacyNoteMetadata.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        if (message.header != null && Object.hasOwnProperty.call(message, "header"))
+            writer.uint32(/* id 1, wireType 2 =*/10).string(message.header);
+        if (message.bulletPoints != null && message.bulletPoints.length)
+            for (var i = 0; i < message.bulletPoints.length; ++i)
+                writer.uint32(/* id 2, wireType 2 =*/18).string(message.bulletPoints[i]);
+        if (message.bannerImageUri != null && Object.hasOwnProperty.call(message, "bannerImageUri"))
+            writer.uint32(/* id 3, wireType 2 =*/26).string(message.bannerImageUri);
+        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
+            writer.uint32(/* id 4, wireType 2 =*/34).string(message.description);
+        return writer;
+    };
+
+    /**
+     * Encodes the specified CouncilCandidacyNoteMetadata message, length delimited. Does not implicitly {@link CouncilCandidacyNoteMetadata.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof CouncilCandidacyNoteMetadata
+     * @static
+     * @param {ICouncilCandidacyNoteMetadata} message CouncilCandidacyNoteMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    CouncilCandidacyNoteMetadata.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes a CouncilCandidacyNoteMetadata message from the specified reader or buffer.
+     * @function decode
+     * @memberof CouncilCandidacyNoteMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {CouncilCandidacyNoteMetadata} CouncilCandidacyNoteMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    CouncilCandidacyNoteMetadata.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.CouncilCandidacyNoteMetadata();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                message.header = reader.string();
+                break;
+            case 2:
+                if (!(message.bulletPoints && message.bulletPoints.length))
+                    message.bulletPoints = [];
+                message.bulletPoints.push(reader.string());
+                break;
+            case 3:
+                message.bannerImageUri = reader.string();
+                break;
+            case 4:
+                message.description = reader.string();
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        return message;
+    };
+
+    /**
+     * Decodes a CouncilCandidacyNoteMetadata message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof CouncilCandidacyNoteMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {CouncilCandidacyNoteMetadata} CouncilCandidacyNoteMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    CouncilCandidacyNoteMetadata.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies a CouncilCandidacyNoteMetadata message.
+     * @function verify
+     * @memberof CouncilCandidacyNoteMetadata
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    CouncilCandidacyNoteMetadata.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        if (message.header != null && message.hasOwnProperty("header"))
+            if (!$util.isString(message.header))
+                return "header: string expected";
+        if (message.bulletPoints != null && message.hasOwnProperty("bulletPoints")) {
+            if (!Array.isArray(message.bulletPoints))
+                return "bulletPoints: array expected";
+            for (var i = 0; i < message.bulletPoints.length; ++i)
+                if (!$util.isString(message.bulletPoints[i]))
+                    return "bulletPoints: string[] expected";
+        }
+        if (message.bannerImageUri != null && message.hasOwnProperty("bannerImageUri"))
+            if (!$util.isString(message.bannerImageUri))
+                return "bannerImageUri: string expected";
+        if (message.description != null && message.hasOwnProperty("description"))
+            if (!$util.isString(message.description))
+                return "description: string expected";
+        return null;
+    };
+
+    /**
+     * Creates a CouncilCandidacyNoteMetadata message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof CouncilCandidacyNoteMetadata
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {CouncilCandidacyNoteMetadata} CouncilCandidacyNoteMetadata
+     */
+    CouncilCandidacyNoteMetadata.fromObject = function fromObject(object) {
+        if (object instanceof $root.CouncilCandidacyNoteMetadata)
+            return object;
+        var message = new $root.CouncilCandidacyNoteMetadata();
+        if (object.header != null)
+            message.header = String(object.header);
+        if (object.bulletPoints) {
+            if (!Array.isArray(object.bulletPoints))
+                throw TypeError(".CouncilCandidacyNoteMetadata.bulletPoints: array expected");
+            message.bulletPoints = [];
+            for (var i = 0; i < object.bulletPoints.length; ++i)
+                message.bulletPoints[i] = String(object.bulletPoints[i]);
+        }
+        if (object.bannerImageUri != null)
+            message.bannerImageUri = String(object.bannerImageUri);
+        if (object.description != null)
+            message.description = String(object.description);
+        return message;
+    };
+
+    /**
+     * Creates a plain object from a CouncilCandidacyNoteMetadata message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof CouncilCandidacyNoteMetadata
+     * @static
+     * @param {CouncilCandidacyNoteMetadata} message CouncilCandidacyNoteMetadata
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    CouncilCandidacyNoteMetadata.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (options.arrays || options.defaults)
+            object.bulletPoints = [];
+        if (options.defaults) {
+            object.header = "";
+            object.bannerImageUri = "";
+            object.description = "";
+        }
+        if (message.header != null && message.hasOwnProperty("header"))
+            object.header = message.header;
+        if (message.bulletPoints && message.bulletPoints.length) {
+            object.bulletPoints = [];
+            for (var j = 0; j < message.bulletPoints.length; ++j)
+                object.bulletPoints[j] = message.bulletPoints[j];
+        }
+        if (message.bannerImageUri != null && message.hasOwnProperty("bannerImageUri"))
+            object.bannerImageUri = message.bannerImageUri;
+        if (message.description != null && message.hasOwnProperty("description"))
+            object.description = message.description;
+        return object;
+    };
+
+    /**
+     * Converts this CouncilCandidacyNoteMetadata to JSON.
+     * @function toJSON
+     * @memberof CouncilCandidacyNoteMetadata
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    CouncilCandidacyNoteMetadata.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    return CouncilCandidacyNoteMetadata;
+})();
+
+$root.MembershipMetadata = (function() {
+
+    /**
+     * Properties of a MembershipMetadata.
+     * @exports IMembershipMetadata
+     * @interface IMembershipMetadata
+     * @property {string|null} [name] MembershipMetadata name
+     * @property {number|null} [avatar] MembershipMetadata avatar
+     * @property {string|null} [about] MembershipMetadata about
+     */
+
+    /**
+     * Constructs a new MembershipMetadata.
+     * @exports MembershipMetadata
+     * @classdesc Represents a MembershipMetadata.
+     * @implements IMembershipMetadata
+     * @constructor
+     * @param {IMembershipMetadata=} [properties] Properties to set
+     */
+    function MembershipMetadata(properties) {
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * MembershipMetadata name.
+     * @member {string} name
+     * @memberof MembershipMetadata
+     * @instance
+     */
+    MembershipMetadata.prototype.name = "";
+
+    /**
+     * MembershipMetadata avatar.
+     * @member {number} avatar
+     * @memberof MembershipMetadata
+     * @instance
+     */
+    MembershipMetadata.prototype.avatar = 0;
+
+    /**
+     * MembershipMetadata about.
+     * @member {string} about
+     * @memberof MembershipMetadata
+     * @instance
+     */
+    MembershipMetadata.prototype.about = "";
+
+    /**
+     * Creates a new MembershipMetadata instance using the specified properties.
+     * @function create
+     * @memberof MembershipMetadata
+     * @static
+     * @param {IMembershipMetadata=} [properties] Properties to set
+     * @returns {MembershipMetadata} MembershipMetadata instance
+     */
+    MembershipMetadata.create = function create(properties) {
+        return new MembershipMetadata(properties);
+    };
+
+    /**
+     * Encodes the specified MembershipMetadata message. Does not implicitly {@link MembershipMetadata.verify|verify} messages.
+     * @function encode
+     * @memberof MembershipMetadata
+     * @static
+     * @param {IMembershipMetadata} message MembershipMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    MembershipMetadata.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        if (message.name != null && Object.hasOwnProperty.call(message, "name"))
+            writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
+        if (message.avatar != null && Object.hasOwnProperty.call(message, "avatar"))
+            writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.avatar);
+        if (message.about != null && Object.hasOwnProperty.call(message, "about"))
+            writer.uint32(/* id 3, wireType 2 =*/26).string(message.about);
+        return writer;
+    };
+
+    /**
+     * Encodes the specified MembershipMetadata message, length delimited. Does not implicitly {@link MembershipMetadata.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof MembershipMetadata
+     * @static
+     * @param {IMembershipMetadata} message MembershipMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    MembershipMetadata.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes a MembershipMetadata message from the specified reader or buffer.
+     * @function decode
+     * @memberof MembershipMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {MembershipMetadata} MembershipMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    MembershipMetadata.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.MembershipMetadata();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                message.name = reader.string();
+                break;
+            case 2:
+                message.avatar = reader.uint32();
+                break;
+            case 3:
+                message.about = reader.string();
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        return message;
+    };
+
+    /**
+     * Decodes a MembershipMetadata message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof MembershipMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {MembershipMetadata} MembershipMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    MembershipMetadata.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies a MembershipMetadata message.
+     * @function verify
+     * @memberof MembershipMetadata
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    MembershipMetadata.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        if (message.name != null && message.hasOwnProperty("name"))
+            if (!$util.isString(message.name))
+                return "name: string expected";
+        if (message.avatar != null && message.hasOwnProperty("avatar"))
+            if (!$util.isInteger(message.avatar))
+                return "avatar: integer expected";
+        if (message.about != null && message.hasOwnProperty("about"))
+            if (!$util.isString(message.about))
+                return "about: string expected";
+        return null;
+    };
+
+    /**
+     * Creates a MembershipMetadata message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof MembershipMetadata
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {MembershipMetadata} MembershipMetadata
+     */
+    MembershipMetadata.fromObject = function fromObject(object) {
+        if (object instanceof $root.MembershipMetadata)
+            return object;
+        var message = new $root.MembershipMetadata();
+        if (object.name != null)
+            message.name = String(object.name);
+        if (object.avatar != null)
+            message.avatar = object.avatar >>> 0;
+        if (object.about != null)
+            message.about = String(object.about);
+        return message;
+    };
+
+    /**
+     * Creates a plain object from a MembershipMetadata message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof MembershipMetadata
+     * @static
+     * @param {MembershipMetadata} message MembershipMetadata
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    MembershipMetadata.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (options.defaults) {
+            object.name = "";
+            object.avatar = 0;
+            object.about = "";
+        }
+        if (message.name != null && message.hasOwnProperty("name"))
+            object.name = message.name;
+        if (message.avatar != null && message.hasOwnProperty("avatar"))
+            object.avatar = message.avatar;
+        if (message.about != null && message.hasOwnProperty("about"))
+            object.about = message.about;
+        return object;
+    };
+
+    /**
+     * Converts this MembershipMetadata to JSON.
+     * @function toJSON
+     * @memberof MembershipMetadata
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    MembershipMetadata.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    return MembershipMetadata;
+})();
+
+$root.OpeningMetadata = (function() {
+
+    /**
+     * Properties of an OpeningMetadata.
+     * @exports IOpeningMetadata
+     * @interface IOpeningMetadata
+     * @property {string} shortDescription OpeningMetadata shortDescription
+     * @property {string} description OpeningMetadata description
+     * @property {number|null} [hiringLimit] OpeningMetadata hiringLimit
+     * @property {number|null} [expectedEndingTimestamp] OpeningMetadata expectedEndingTimestamp
+     * @property {string} applicationDetails OpeningMetadata applicationDetails
+     * @property {Array.<OpeningMetadata.IApplicationFormQuestion>|null} [applicationFormQuestions] OpeningMetadata applicationFormQuestions
+     */
+
+    /**
+     * Constructs a new OpeningMetadata.
+     * @exports OpeningMetadata
+     * @classdesc Represents an OpeningMetadata.
+     * @implements IOpeningMetadata
+     * @constructor
+     * @param {IOpeningMetadata=} [properties] Properties to set
+     */
+    function OpeningMetadata(properties) {
+        this.applicationFormQuestions = [];
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * OpeningMetadata shortDescription.
+     * @member {string} shortDescription
+     * @memberof OpeningMetadata
+     * @instance
+     */
+    OpeningMetadata.prototype.shortDescription = "";
+
+    /**
+     * OpeningMetadata description.
+     * @member {string} description
+     * @memberof OpeningMetadata
+     * @instance
+     */
+    OpeningMetadata.prototype.description = "";
+
+    /**
+     * OpeningMetadata hiringLimit.
+     * @member {number} hiringLimit
+     * @memberof OpeningMetadata
+     * @instance
+     */
+    OpeningMetadata.prototype.hiringLimit = 0;
+
+    /**
+     * OpeningMetadata expectedEndingTimestamp.
+     * @member {number} expectedEndingTimestamp
+     * @memberof OpeningMetadata
+     * @instance
+     */
+    OpeningMetadata.prototype.expectedEndingTimestamp = 0;
+
+    /**
+     * OpeningMetadata applicationDetails.
+     * @member {string} applicationDetails
+     * @memberof OpeningMetadata
+     * @instance
+     */
+    OpeningMetadata.prototype.applicationDetails = "";
+
+    /**
+     * OpeningMetadata applicationFormQuestions.
+     * @member {Array.<OpeningMetadata.IApplicationFormQuestion>} applicationFormQuestions
+     * @memberof OpeningMetadata
+     * @instance
+     */
+    OpeningMetadata.prototype.applicationFormQuestions = $util.emptyArray;
+
+    /**
+     * Creates a new OpeningMetadata instance using the specified properties.
+     * @function create
+     * @memberof OpeningMetadata
+     * @static
+     * @param {IOpeningMetadata=} [properties] Properties to set
+     * @returns {OpeningMetadata} OpeningMetadata instance
+     */
+    OpeningMetadata.create = function create(properties) {
+        return new OpeningMetadata(properties);
+    };
+
+    /**
+     * Encodes the specified OpeningMetadata message. Does not implicitly {@link OpeningMetadata.verify|verify} messages.
+     * @function encode
+     * @memberof OpeningMetadata
+     * @static
+     * @param {IOpeningMetadata} message OpeningMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    OpeningMetadata.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        writer.uint32(/* id 1, wireType 2 =*/10).string(message.shortDescription);
+        writer.uint32(/* id 2, wireType 2 =*/18).string(message.description);
+        if (message.hiringLimit != null && Object.hasOwnProperty.call(message, "hiringLimit"))
+            writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.hiringLimit);
+        if (message.expectedEndingTimestamp != null && Object.hasOwnProperty.call(message, "expectedEndingTimestamp"))
+            writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.expectedEndingTimestamp);
+        writer.uint32(/* id 5, wireType 2 =*/42).string(message.applicationDetails);
+        if (message.applicationFormQuestions != null && message.applicationFormQuestions.length)
+            for (var i = 0; i < message.applicationFormQuestions.length; ++i)
+                $root.OpeningMetadata.ApplicationFormQuestion.encode(message.applicationFormQuestions[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
+        return writer;
+    };
+
+    /**
+     * Encodes the specified OpeningMetadata message, length delimited. Does not implicitly {@link OpeningMetadata.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof OpeningMetadata
+     * @static
+     * @param {IOpeningMetadata} message OpeningMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    OpeningMetadata.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes an OpeningMetadata message from the specified reader or buffer.
+     * @function decode
+     * @memberof OpeningMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {OpeningMetadata} OpeningMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    OpeningMetadata.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.OpeningMetadata();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                message.shortDescription = reader.string();
+                break;
+            case 2:
+                message.description = reader.string();
+                break;
+            case 3:
+                message.hiringLimit = reader.uint32();
+                break;
+            case 4:
+                message.expectedEndingTimestamp = reader.uint32();
+                break;
+            case 5:
+                message.applicationDetails = reader.string();
+                break;
+            case 6:
+                if (!(message.applicationFormQuestions && message.applicationFormQuestions.length))
+                    message.applicationFormQuestions = [];
+                message.applicationFormQuestions.push($root.OpeningMetadata.ApplicationFormQuestion.decode(reader, reader.uint32()));
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        if (!message.hasOwnProperty("shortDescription"))
+            throw $util.ProtocolError("missing required 'shortDescription'", { instance: message });
+        if (!message.hasOwnProperty("description"))
+            throw $util.ProtocolError("missing required 'description'", { instance: message });
+        if (!message.hasOwnProperty("applicationDetails"))
+            throw $util.ProtocolError("missing required 'applicationDetails'", { instance: message });
+        return message;
+    };
+
+    /**
+     * Decodes an OpeningMetadata message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof OpeningMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {OpeningMetadata} OpeningMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    OpeningMetadata.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies an OpeningMetadata message.
+     * @function verify
+     * @memberof OpeningMetadata
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    OpeningMetadata.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        if (!$util.isString(message.shortDescription))
+            return "shortDescription: string expected";
+        if (!$util.isString(message.description))
+            return "description: string expected";
+        if (message.hiringLimit != null && message.hasOwnProperty("hiringLimit"))
+            if (!$util.isInteger(message.hiringLimit))
+                return "hiringLimit: integer expected";
+        if (message.expectedEndingTimestamp != null && message.hasOwnProperty("expectedEndingTimestamp"))
+            if (!$util.isInteger(message.expectedEndingTimestamp))
+                return "expectedEndingTimestamp: integer expected";
+        if (!$util.isString(message.applicationDetails))
+            return "applicationDetails: string expected";
+        if (message.applicationFormQuestions != null && message.hasOwnProperty("applicationFormQuestions")) {
+            if (!Array.isArray(message.applicationFormQuestions))
+                return "applicationFormQuestions: array expected";
+            for (var i = 0; i < message.applicationFormQuestions.length; ++i) {
+                var error = $root.OpeningMetadata.ApplicationFormQuestion.verify(message.applicationFormQuestions[i]);
+                if (error)
+                    return "applicationFormQuestions." + error;
+            }
+        }
+        return null;
+    };
+
+    /**
+     * Creates an OpeningMetadata message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof OpeningMetadata
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {OpeningMetadata} OpeningMetadata
+     */
+    OpeningMetadata.fromObject = function fromObject(object) {
+        if (object instanceof $root.OpeningMetadata)
+            return object;
+        var message = new $root.OpeningMetadata();
+        if (object.shortDescription != null)
+            message.shortDescription = String(object.shortDescription);
+        if (object.description != null)
+            message.description = String(object.description);
+        if (object.hiringLimit != null)
+            message.hiringLimit = object.hiringLimit >>> 0;
+        if (object.expectedEndingTimestamp != null)
+            message.expectedEndingTimestamp = object.expectedEndingTimestamp >>> 0;
+        if (object.applicationDetails != null)
+            message.applicationDetails = String(object.applicationDetails);
+        if (object.applicationFormQuestions) {
+            if (!Array.isArray(object.applicationFormQuestions))
+                throw TypeError(".OpeningMetadata.applicationFormQuestions: array expected");
+            message.applicationFormQuestions = [];
+            for (var i = 0; i < object.applicationFormQuestions.length; ++i) {
+                if (typeof object.applicationFormQuestions[i] !== "object")
+                    throw TypeError(".OpeningMetadata.applicationFormQuestions: object expected");
+                message.applicationFormQuestions[i] = $root.OpeningMetadata.ApplicationFormQuestion.fromObject(object.applicationFormQuestions[i]);
+            }
+        }
+        return message;
+    };
+
+    /**
+     * Creates a plain object from an OpeningMetadata message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof OpeningMetadata
+     * @static
+     * @param {OpeningMetadata} message OpeningMetadata
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    OpeningMetadata.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (options.arrays || options.defaults)
+            object.applicationFormQuestions = [];
+        if (options.defaults) {
+            object.shortDescription = "";
+            object.description = "";
+            object.hiringLimit = 0;
+            object.expectedEndingTimestamp = 0;
+            object.applicationDetails = "";
+        }
+        if (message.shortDescription != null && message.hasOwnProperty("shortDescription"))
+            object.shortDescription = message.shortDescription;
+        if (message.description != null && message.hasOwnProperty("description"))
+            object.description = message.description;
+        if (message.hiringLimit != null && message.hasOwnProperty("hiringLimit"))
+            object.hiringLimit = message.hiringLimit;
+        if (message.expectedEndingTimestamp != null && message.hasOwnProperty("expectedEndingTimestamp"))
+            object.expectedEndingTimestamp = message.expectedEndingTimestamp;
+        if (message.applicationDetails != null && message.hasOwnProperty("applicationDetails"))
+            object.applicationDetails = message.applicationDetails;
+        if (message.applicationFormQuestions && message.applicationFormQuestions.length) {
+            object.applicationFormQuestions = [];
+            for (var j = 0; j < message.applicationFormQuestions.length; ++j)
+                object.applicationFormQuestions[j] = $root.OpeningMetadata.ApplicationFormQuestion.toObject(message.applicationFormQuestions[j], options);
+        }
+        return object;
+    };
+
+    /**
+     * Converts this OpeningMetadata to JSON.
+     * @function toJSON
+     * @memberof OpeningMetadata
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    OpeningMetadata.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    OpeningMetadata.ApplicationFormQuestion = (function() {
+
+        /**
+         * Properties of an ApplicationFormQuestion.
+         * @memberof OpeningMetadata
+         * @interface IApplicationFormQuestion
+         * @property {string} question ApplicationFormQuestion question
+         * @property {OpeningMetadata.ApplicationFormQuestion.InputType} type ApplicationFormQuestion type
+         */
+
+        /**
+         * Constructs a new ApplicationFormQuestion.
+         * @memberof OpeningMetadata
+         * @classdesc Represents an ApplicationFormQuestion.
+         * @implements IApplicationFormQuestion
+         * @constructor
+         * @param {OpeningMetadata.IApplicationFormQuestion=} [properties] Properties to set
+         */
+        function ApplicationFormQuestion(properties) {
+            if (properties)
+                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                    if (properties[keys[i]] != null)
+                        this[keys[i]] = properties[keys[i]];
+        }
+
+        /**
+         * ApplicationFormQuestion question.
+         * @member {string} question
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @instance
+         */
+        ApplicationFormQuestion.prototype.question = "";
+
+        /**
+         * ApplicationFormQuestion type.
+         * @member {OpeningMetadata.ApplicationFormQuestion.InputType} type
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @instance
+         */
+        ApplicationFormQuestion.prototype.type = 1;
+
+        /**
+         * Creates a new ApplicationFormQuestion instance using the specified properties.
+         * @function create
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @static
+         * @param {OpeningMetadata.IApplicationFormQuestion=} [properties] Properties to set
+         * @returns {OpeningMetadata.ApplicationFormQuestion} ApplicationFormQuestion instance
+         */
+        ApplicationFormQuestion.create = function create(properties) {
+            return new ApplicationFormQuestion(properties);
+        };
+
+        /**
+         * Encodes the specified ApplicationFormQuestion message. Does not implicitly {@link OpeningMetadata.ApplicationFormQuestion.verify|verify} messages.
+         * @function encode
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @static
+         * @param {OpeningMetadata.IApplicationFormQuestion} message ApplicationFormQuestion message or plain object to encode
+         * @param {$protobuf.Writer} [writer] Writer to encode to
+         * @returns {$protobuf.Writer} Writer
+         */
+        ApplicationFormQuestion.encode = function encode(message, writer) {
+            if (!writer)
+                writer = $Writer.create();
+            writer.uint32(/* id 1, wireType 2 =*/10).string(message.question);
+            writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type);
+            return writer;
+        };
+
+        /**
+         * Encodes the specified ApplicationFormQuestion message, length delimited. Does not implicitly {@link OpeningMetadata.ApplicationFormQuestion.verify|verify} messages.
+         * @function encodeDelimited
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @static
+         * @param {OpeningMetadata.IApplicationFormQuestion} message ApplicationFormQuestion message or plain object to encode
+         * @param {$protobuf.Writer} [writer] Writer to encode to
+         * @returns {$protobuf.Writer} Writer
+         */
+        ApplicationFormQuestion.encodeDelimited = function encodeDelimited(message, writer) {
+            return this.encode(message, writer).ldelim();
+        };
+
+        /**
+         * Decodes an ApplicationFormQuestion message from the specified reader or buffer.
+         * @function decode
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @static
+         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+         * @param {number} [length] Message length if known beforehand
+         * @returns {OpeningMetadata.ApplicationFormQuestion} ApplicationFormQuestion
+         * @throws {Error} If the payload is not a reader or valid buffer
+         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+         */
+        ApplicationFormQuestion.decode = function decode(reader, length) {
+            if (!(reader instanceof $Reader))
+                reader = $Reader.create(reader);
+            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.OpeningMetadata.ApplicationFormQuestion();
+            while (reader.pos < end) {
+                var tag = reader.uint32();
+                switch (tag >>> 3) {
+                case 1:
+                    message.question = reader.string();
+                    break;
+                case 2:
+                    message.type = reader.int32();
+                    break;
+                default:
+                    reader.skipType(tag & 7);
+                    break;
+                }
+            }
+            if (!message.hasOwnProperty("question"))
+                throw $util.ProtocolError("missing required 'question'", { instance: message });
+            if (!message.hasOwnProperty("type"))
+                throw $util.ProtocolError("missing required 'type'", { instance: message });
+            return message;
+        };
+
+        /**
+         * Decodes an ApplicationFormQuestion message from the specified reader or buffer, length delimited.
+         * @function decodeDelimited
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @static
+         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+         * @returns {OpeningMetadata.ApplicationFormQuestion} ApplicationFormQuestion
+         * @throws {Error} If the payload is not a reader or valid buffer
+         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+         */
+        ApplicationFormQuestion.decodeDelimited = function decodeDelimited(reader) {
+            if (!(reader instanceof $Reader))
+                reader = new $Reader(reader);
+            return this.decode(reader, reader.uint32());
+        };
+
+        /**
+         * Verifies an ApplicationFormQuestion message.
+         * @function verify
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @static
+         * @param {Object.<string,*>} message Plain object to verify
+         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+         */
+        ApplicationFormQuestion.verify = function verify(message) {
+            if (typeof message !== "object" || message === null)
+                return "object expected";
+            if (!$util.isString(message.question))
+                return "question: string expected";
+            switch (message.type) {
+            default:
+                return "type: enum value expected";
+            case 1:
+            case 2:
+                break;
+            }
+            return null;
+        };
+
+        /**
+         * Creates an ApplicationFormQuestion message from a plain object. Also converts values to their respective internal types.
+         * @function fromObject
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @static
+         * @param {Object.<string,*>} object Plain object
+         * @returns {OpeningMetadata.ApplicationFormQuestion} ApplicationFormQuestion
+         */
+        ApplicationFormQuestion.fromObject = function fromObject(object) {
+            if (object instanceof $root.OpeningMetadata.ApplicationFormQuestion)
+                return object;
+            var message = new $root.OpeningMetadata.ApplicationFormQuestion();
+            if (object.question != null)
+                message.question = String(object.question);
+            switch (object.type) {
+            case "TEXT":
+            case 1:
+                message.type = 1;
+                break;
+            case "TEXTAREA":
+            case 2:
+                message.type = 2;
+                break;
+            }
+            return message;
+        };
+
+        /**
+         * Creates a plain object from an ApplicationFormQuestion message. Also converts values to other types if specified.
+         * @function toObject
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @static
+         * @param {OpeningMetadata.ApplicationFormQuestion} message ApplicationFormQuestion
+         * @param {$protobuf.IConversionOptions} [options] Conversion options
+         * @returns {Object.<string,*>} Plain object
+         */
+        ApplicationFormQuestion.toObject = function toObject(message, options) {
+            if (!options)
+                options = {};
+            var object = {};
+            if (options.defaults) {
+                object.question = "";
+                object.type = options.enums === String ? "TEXT" : 1;
+            }
+            if (message.question != null && message.hasOwnProperty("question"))
+                object.question = message.question;
+            if (message.type != null && message.hasOwnProperty("type"))
+                object.type = options.enums === String ? $root.OpeningMetadata.ApplicationFormQuestion.InputType[message.type] : message.type;
+            return object;
+        };
+
+        /**
+         * Converts this ApplicationFormQuestion to JSON.
+         * @function toJSON
+         * @memberof OpeningMetadata.ApplicationFormQuestion
+         * @instance
+         * @returns {Object.<string,*>} JSON object
+         */
+        ApplicationFormQuestion.prototype.toJSON = function toJSON() {
+            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+        };
+
+        /**
+         * InputType enum.
+         * @name OpeningMetadata.ApplicationFormQuestion.InputType
+         * @enum {number}
+         * @property {number} TEXT=1 TEXT value
+         * @property {number} TEXTAREA=2 TEXTAREA value
+         */
+        ApplicationFormQuestion.InputType = (function() {
+            var valuesById = {}, values = Object.create(valuesById);
+            values[valuesById[1] = "TEXT"] = 1;
+            values[valuesById[2] = "TEXTAREA"] = 2;
+            return values;
+        })();
+
+        return ApplicationFormQuestion;
+    })();
+
+    return OpeningMetadata;
+})();
+
+$root.UpcomingOpeningMetadata = (function() {
+
+    /**
+     * Properties of an UpcomingOpeningMetadata.
+     * @exports IUpcomingOpeningMetadata
+     * @interface IUpcomingOpeningMetadata
+     * @property {number} expectedStart UpcomingOpeningMetadata expectedStart
+     * @property {Long} rewardPerBlock UpcomingOpeningMetadata rewardPerBlock
+     * @property {Long} minApplicationStake UpcomingOpeningMetadata minApplicationStake
+     * @property {IOpeningMetadata} metadata UpcomingOpeningMetadata metadata
+     */
+
+    /**
+     * Constructs a new UpcomingOpeningMetadata.
+     * @exports UpcomingOpeningMetadata
+     * @classdesc Represents an UpcomingOpeningMetadata.
+     * @implements IUpcomingOpeningMetadata
+     * @constructor
+     * @param {IUpcomingOpeningMetadata=} [properties] Properties to set
+     */
+    function UpcomingOpeningMetadata(properties) {
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * UpcomingOpeningMetadata expectedStart.
+     * @member {number} expectedStart
+     * @memberof UpcomingOpeningMetadata
+     * @instance
+     */
+    UpcomingOpeningMetadata.prototype.expectedStart = 0;
+
+    /**
+     * UpcomingOpeningMetadata rewardPerBlock.
+     * @member {Long} rewardPerBlock
+     * @memberof UpcomingOpeningMetadata
+     * @instance
+     */
+    UpcomingOpeningMetadata.prototype.rewardPerBlock = $util.Long ? $util.Long.fromBits(0,0,true) : 0;
+
+    /**
+     * UpcomingOpeningMetadata minApplicationStake.
+     * @member {Long} minApplicationStake
+     * @memberof UpcomingOpeningMetadata
+     * @instance
+     */
+    UpcomingOpeningMetadata.prototype.minApplicationStake = $util.Long ? $util.Long.fromBits(0,0,true) : 0;
+
+    /**
+     * UpcomingOpeningMetadata metadata.
+     * @member {IOpeningMetadata} metadata
+     * @memberof UpcomingOpeningMetadata
+     * @instance
+     */
+    UpcomingOpeningMetadata.prototype.metadata = null;
+
+    /**
+     * Creates a new UpcomingOpeningMetadata instance using the specified properties.
+     * @function create
+     * @memberof UpcomingOpeningMetadata
+     * @static
+     * @param {IUpcomingOpeningMetadata=} [properties] Properties to set
+     * @returns {UpcomingOpeningMetadata} UpcomingOpeningMetadata instance
+     */
+    UpcomingOpeningMetadata.create = function create(properties) {
+        return new UpcomingOpeningMetadata(properties);
+    };
+
+    /**
+     * Encodes the specified UpcomingOpeningMetadata message. Does not implicitly {@link UpcomingOpeningMetadata.verify|verify} messages.
+     * @function encode
+     * @memberof UpcomingOpeningMetadata
+     * @static
+     * @param {IUpcomingOpeningMetadata} message UpcomingOpeningMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    UpcomingOpeningMetadata.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.expectedStart);
+        writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.rewardPerBlock);
+        writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.minApplicationStake);
+        $root.OpeningMetadata.encode(message.metadata, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
+        return writer;
+    };
+
+    /**
+     * Encodes the specified UpcomingOpeningMetadata message, length delimited. Does not implicitly {@link UpcomingOpeningMetadata.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof UpcomingOpeningMetadata
+     * @static
+     * @param {IUpcomingOpeningMetadata} message UpcomingOpeningMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    UpcomingOpeningMetadata.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes an UpcomingOpeningMetadata message from the specified reader or buffer.
+     * @function decode
+     * @memberof UpcomingOpeningMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {UpcomingOpeningMetadata} UpcomingOpeningMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    UpcomingOpeningMetadata.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.UpcomingOpeningMetadata();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                message.expectedStart = reader.uint32();
+                break;
+            case 2:
+                message.rewardPerBlock = reader.uint64();
+                break;
+            case 3:
+                message.minApplicationStake = reader.uint64();
+                break;
+            case 4:
+                message.metadata = $root.OpeningMetadata.decode(reader, reader.uint32());
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        if (!message.hasOwnProperty("expectedStart"))
+            throw $util.ProtocolError("missing required 'expectedStart'", { instance: message });
+        if (!message.hasOwnProperty("rewardPerBlock"))
+            throw $util.ProtocolError("missing required 'rewardPerBlock'", { instance: message });
+        if (!message.hasOwnProperty("minApplicationStake"))
+            throw $util.ProtocolError("missing required 'minApplicationStake'", { instance: message });
+        if (!message.hasOwnProperty("metadata"))
+            throw $util.ProtocolError("missing required 'metadata'", { instance: message });
+        return message;
+    };
+
+    /**
+     * Decodes an UpcomingOpeningMetadata message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof UpcomingOpeningMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {UpcomingOpeningMetadata} UpcomingOpeningMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    UpcomingOpeningMetadata.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies an UpcomingOpeningMetadata message.
+     * @function verify
+     * @memberof UpcomingOpeningMetadata
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    UpcomingOpeningMetadata.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        if (!$util.isInteger(message.expectedStart))
+            return "expectedStart: integer expected";
+        if (!$util.isInteger(message.rewardPerBlock) && !(message.rewardPerBlock && $util.isInteger(message.rewardPerBlock.low) && $util.isInteger(message.rewardPerBlock.high)))
+            return "rewardPerBlock: integer|Long expected";
+        if (!$util.isInteger(message.minApplicationStake) && !(message.minApplicationStake && $util.isInteger(message.minApplicationStake.low) && $util.isInteger(message.minApplicationStake.high)))
+            return "minApplicationStake: integer|Long expected";
+        {
+            var error = $root.OpeningMetadata.verify(message.metadata);
+            if (error)
+                return "metadata." + error;
+        }
+        return null;
+    };
+
+    /**
+     * Creates an UpcomingOpeningMetadata message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof UpcomingOpeningMetadata
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {UpcomingOpeningMetadata} UpcomingOpeningMetadata
+     */
+    UpcomingOpeningMetadata.fromObject = function fromObject(object) {
+        if (object instanceof $root.UpcomingOpeningMetadata)
+            return object;
+        var message = new $root.UpcomingOpeningMetadata();
+        if (object.expectedStart != null)
+            message.expectedStart = object.expectedStart >>> 0;
+        if (object.rewardPerBlock != null)
+            if ($util.Long)
+                (message.rewardPerBlock = $util.Long.fromValue(object.rewardPerBlock)).unsigned = true;
+            else if (typeof object.rewardPerBlock === "string")
+                message.rewardPerBlock = parseInt(object.rewardPerBlock, 10);
+            else if (typeof object.rewardPerBlock === "number")
+                message.rewardPerBlock = object.rewardPerBlock;
+            else if (typeof object.rewardPerBlock === "object")
+                message.rewardPerBlock = new $util.LongBits(object.rewardPerBlock.low >>> 0, object.rewardPerBlock.high >>> 0).toNumber(true);
+        if (object.minApplicationStake != null)
+            if ($util.Long)
+                (message.minApplicationStake = $util.Long.fromValue(object.minApplicationStake)).unsigned = true;
+            else if (typeof object.minApplicationStake === "string")
+                message.minApplicationStake = parseInt(object.minApplicationStake, 10);
+            else if (typeof object.minApplicationStake === "number")
+                message.minApplicationStake = object.minApplicationStake;
+            else if (typeof object.minApplicationStake === "object")
+                message.minApplicationStake = new $util.LongBits(object.minApplicationStake.low >>> 0, object.minApplicationStake.high >>> 0).toNumber(true);
+        if (object.metadata != null) {
+            if (typeof object.metadata !== "object")
+                throw TypeError(".UpcomingOpeningMetadata.metadata: object expected");
+            message.metadata = $root.OpeningMetadata.fromObject(object.metadata);
+        }
+        return message;
+    };
+
+    /**
+     * Creates a plain object from an UpcomingOpeningMetadata message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof UpcomingOpeningMetadata
+     * @static
+     * @param {UpcomingOpeningMetadata} message UpcomingOpeningMetadata
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    UpcomingOpeningMetadata.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (options.defaults) {
+            object.expectedStart = 0;
+            if ($util.Long) {
+                var long = new $util.Long(0, 0, true);
+                object.rewardPerBlock = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
+            } else
+                object.rewardPerBlock = options.longs === String ? "0" : 0;
+            if ($util.Long) {
+                var long = new $util.Long(0, 0, true);
+                object.minApplicationStake = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
+            } else
+                object.minApplicationStake = options.longs === String ? "0" : 0;
+            object.metadata = null;
+        }
+        if (message.expectedStart != null && message.hasOwnProperty("expectedStart"))
+            object.expectedStart = message.expectedStart;
+        if (message.rewardPerBlock != null && message.hasOwnProperty("rewardPerBlock"))
+            if (typeof message.rewardPerBlock === "number")
+                object.rewardPerBlock = options.longs === String ? String(message.rewardPerBlock) : message.rewardPerBlock;
+            else
+                object.rewardPerBlock = options.longs === String ? $util.Long.prototype.toString.call(message.rewardPerBlock) : options.longs === Number ? new $util.LongBits(message.rewardPerBlock.low >>> 0, message.rewardPerBlock.high >>> 0).toNumber(true) : message.rewardPerBlock;
+        if (message.minApplicationStake != null && message.hasOwnProperty("minApplicationStake"))
+            if (typeof message.minApplicationStake === "number")
+                object.minApplicationStake = options.longs === String ? String(message.minApplicationStake) : message.minApplicationStake;
+            else
+                object.minApplicationStake = options.longs === String ? $util.Long.prototype.toString.call(message.minApplicationStake) : options.longs === Number ? new $util.LongBits(message.minApplicationStake.low >>> 0, message.minApplicationStake.high >>> 0).toNumber(true) : message.minApplicationStake;
+        if (message.metadata != null && message.hasOwnProperty("metadata"))
+            object.metadata = $root.OpeningMetadata.toObject(message.metadata, options);
+        return object;
+    };
+
+    /**
+     * Converts this UpcomingOpeningMetadata to JSON.
+     * @function toJSON
+     * @memberof UpcomingOpeningMetadata
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    UpcomingOpeningMetadata.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    return UpcomingOpeningMetadata;
+})();
+
+$root.ApplicationMetadata = (function() {
+
+    /**
+     * Properties of an ApplicationMetadata.
+     * @exports IApplicationMetadata
+     * @interface IApplicationMetadata
+     * @property {Array.<string>|null} [answers] ApplicationMetadata answers
+     */
+
+    /**
+     * Constructs a new ApplicationMetadata.
+     * @exports ApplicationMetadata
+     * @classdesc Represents an ApplicationMetadata.
+     * @implements IApplicationMetadata
+     * @constructor
+     * @param {IApplicationMetadata=} [properties] Properties to set
+     */
+    function ApplicationMetadata(properties) {
+        this.answers = [];
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * ApplicationMetadata answers.
+     * @member {Array.<string>} answers
+     * @memberof ApplicationMetadata
+     * @instance
+     */
+    ApplicationMetadata.prototype.answers = $util.emptyArray;
+
+    /**
+     * Creates a new ApplicationMetadata instance using the specified properties.
+     * @function create
+     * @memberof ApplicationMetadata
+     * @static
+     * @param {IApplicationMetadata=} [properties] Properties to set
+     * @returns {ApplicationMetadata} ApplicationMetadata instance
+     */
+    ApplicationMetadata.create = function create(properties) {
+        return new ApplicationMetadata(properties);
+    };
+
+    /**
+     * Encodes the specified ApplicationMetadata message. Does not implicitly {@link ApplicationMetadata.verify|verify} messages.
+     * @function encode
+     * @memberof ApplicationMetadata
+     * @static
+     * @param {IApplicationMetadata} message ApplicationMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    ApplicationMetadata.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        if (message.answers != null && message.answers.length)
+            for (var i = 0; i < message.answers.length; ++i)
+                writer.uint32(/* id 1, wireType 2 =*/10).string(message.answers[i]);
+        return writer;
+    };
+
+    /**
+     * Encodes the specified ApplicationMetadata message, length delimited. Does not implicitly {@link ApplicationMetadata.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof ApplicationMetadata
+     * @static
+     * @param {IApplicationMetadata} message ApplicationMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    ApplicationMetadata.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes an ApplicationMetadata message from the specified reader or buffer.
+     * @function decode
+     * @memberof ApplicationMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {ApplicationMetadata} ApplicationMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    ApplicationMetadata.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ApplicationMetadata();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                if (!(message.answers && message.answers.length))
+                    message.answers = [];
+                message.answers.push(reader.string());
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        return message;
+    };
+
+    /**
+     * Decodes an ApplicationMetadata message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof ApplicationMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {ApplicationMetadata} ApplicationMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    ApplicationMetadata.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies an ApplicationMetadata message.
+     * @function verify
+     * @memberof ApplicationMetadata
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    ApplicationMetadata.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        if (message.answers != null && message.hasOwnProperty("answers")) {
+            if (!Array.isArray(message.answers))
+                return "answers: array expected";
+            for (var i = 0; i < message.answers.length; ++i)
+                if (!$util.isString(message.answers[i]))
+                    return "answers: string[] expected";
+        }
+        return null;
+    };
+
+    /**
+     * Creates an ApplicationMetadata message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof ApplicationMetadata
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {ApplicationMetadata} ApplicationMetadata
+     */
+    ApplicationMetadata.fromObject = function fromObject(object) {
+        if (object instanceof $root.ApplicationMetadata)
+            return object;
+        var message = new $root.ApplicationMetadata();
+        if (object.answers) {
+            if (!Array.isArray(object.answers))
+                throw TypeError(".ApplicationMetadata.answers: array expected");
+            message.answers = [];
+            for (var i = 0; i < object.answers.length; ++i)
+                message.answers[i] = String(object.answers[i]);
+        }
+        return message;
+    };
+
+    /**
+     * Creates a plain object from an ApplicationMetadata message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof ApplicationMetadata
+     * @static
+     * @param {ApplicationMetadata} message ApplicationMetadata
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    ApplicationMetadata.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (options.arrays || options.defaults)
+            object.answers = [];
+        if (message.answers && message.answers.length) {
+            object.answers = [];
+            for (var j = 0; j < message.answers.length; ++j)
+                object.answers[j] = message.answers[j];
+        }
+        return object;
+    };
+
+    /**
+     * Converts this ApplicationMetadata to JSON.
+     * @function toJSON
+     * @memberof ApplicationMetadata
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    ApplicationMetadata.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    return ApplicationMetadata;
+})();
+
+$root.WorkingGroupMetadata = (function() {
+
+    /**
+     * Properties of a WorkingGroupMetadata.
+     * @exports IWorkingGroupMetadata
+     * @interface IWorkingGroupMetadata
+     * @property {string|null} [description] WorkingGroupMetadata description
+     * @property {string|null} [about] WorkingGroupMetadata about
+     * @property {string|null} [status] WorkingGroupMetadata status
+     * @property {string|null} [statusMessage] WorkingGroupMetadata statusMessage
+     */
+
+    /**
+     * Constructs a new WorkingGroupMetadata.
+     * @exports WorkingGroupMetadata
+     * @classdesc Represents a WorkingGroupMetadata.
+     * @implements IWorkingGroupMetadata
+     * @constructor
+     * @param {IWorkingGroupMetadata=} [properties] Properties to set
+     */
+    function WorkingGroupMetadata(properties) {
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * WorkingGroupMetadata description.
+     * @member {string} description
+     * @memberof WorkingGroupMetadata
+     * @instance
+     */
+    WorkingGroupMetadata.prototype.description = "";
+
+    /**
+     * WorkingGroupMetadata about.
+     * @member {string} about
+     * @memberof WorkingGroupMetadata
+     * @instance
+     */
+    WorkingGroupMetadata.prototype.about = "";
+
+    /**
+     * WorkingGroupMetadata status.
+     * @member {string} status
+     * @memberof WorkingGroupMetadata
+     * @instance
+     */
+    WorkingGroupMetadata.prototype.status = "";
+
+    /**
+     * WorkingGroupMetadata statusMessage.
+     * @member {string} statusMessage
+     * @memberof WorkingGroupMetadata
+     * @instance
+     */
+    WorkingGroupMetadata.prototype.statusMessage = "";
+
+    /**
+     * Creates a new WorkingGroupMetadata instance using the specified properties.
+     * @function create
+     * @memberof WorkingGroupMetadata
+     * @static
+     * @param {IWorkingGroupMetadata=} [properties] Properties to set
+     * @returns {WorkingGroupMetadata} WorkingGroupMetadata instance
+     */
+    WorkingGroupMetadata.create = function create(properties) {
+        return new WorkingGroupMetadata(properties);
+    };
+
+    /**
+     * Encodes the specified WorkingGroupMetadata message. Does not implicitly {@link WorkingGroupMetadata.verify|verify} messages.
+     * @function encode
+     * @memberof WorkingGroupMetadata
+     * @static
+     * @param {IWorkingGroupMetadata} message WorkingGroupMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    WorkingGroupMetadata.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        if (message.description != null && Object.hasOwnProperty.call(message, "description"))
+            writer.uint32(/* id 1, wireType 2 =*/10).string(message.description);
+        if (message.about != null && Object.hasOwnProperty.call(message, "about"))
+            writer.uint32(/* id 2, wireType 2 =*/18).string(message.about);
+        if (message.status != null && Object.hasOwnProperty.call(message, "status"))
+            writer.uint32(/* id 3, wireType 2 =*/26).string(message.status);
+        if (message.statusMessage != null && Object.hasOwnProperty.call(message, "statusMessage"))
+            writer.uint32(/* id 4, wireType 2 =*/34).string(message.statusMessage);
+        return writer;
+    };
+
+    /**
+     * Encodes the specified WorkingGroupMetadata message, length delimited. Does not implicitly {@link WorkingGroupMetadata.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof WorkingGroupMetadata
+     * @static
+     * @param {IWorkingGroupMetadata} message WorkingGroupMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    WorkingGroupMetadata.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes a WorkingGroupMetadata message from the specified reader or buffer.
+     * @function decode
+     * @memberof WorkingGroupMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {WorkingGroupMetadata} WorkingGroupMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    WorkingGroupMetadata.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.WorkingGroupMetadata();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                message.description = reader.string();
+                break;
+            case 2:
+                message.about = reader.string();
+                break;
+            case 3:
+                message.status = reader.string();
+                break;
+            case 4:
+                message.statusMessage = reader.string();
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        return message;
+    };
+
+    /**
+     * Decodes a WorkingGroupMetadata message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof WorkingGroupMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {WorkingGroupMetadata} WorkingGroupMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    WorkingGroupMetadata.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies a WorkingGroupMetadata message.
+     * @function verify
+     * @memberof WorkingGroupMetadata
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    WorkingGroupMetadata.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        if (message.description != null && message.hasOwnProperty("description"))
+            if (!$util.isString(message.description))
+                return "description: string expected";
+        if (message.about != null && message.hasOwnProperty("about"))
+            if (!$util.isString(message.about))
+                return "about: string expected";
+        if (message.status != null && message.hasOwnProperty("status"))
+            if (!$util.isString(message.status))
+                return "status: string expected";
+        if (message.statusMessage != null && message.hasOwnProperty("statusMessage"))
+            if (!$util.isString(message.statusMessage))
+                return "statusMessage: string expected";
+        return null;
+    };
+
+    /**
+     * Creates a WorkingGroupMetadata message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof WorkingGroupMetadata
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {WorkingGroupMetadata} WorkingGroupMetadata
+     */
+    WorkingGroupMetadata.fromObject = function fromObject(object) {
+        if (object instanceof $root.WorkingGroupMetadata)
+            return object;
+        var message = new $root.WorkingGroupMetadata();
+        if (object.description != null)
+            message.description = String(object.description);
+        if (object.about != null)
+            message.about = String(object.about);
+        if (object.status != null)
+            message.status = String(object.status);
+        if (object.statusMessage != null)
+            message.statusMessage = String(object.statusMessage);
+        return message;
+    };
+
+    /**
+     * Creates a plain object from a WorkingGroupMetadata message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof WorkingGroupMetadata
+     * @static
+     * @param {WorkingGroupMetadata} message WorkingGroupMetadata
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    WorkingGroupMetadata.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (options.defaults) {
+            object.description = "";
+            object.about = "";
+            object.status = "";
+            object.statusMessage = "";
+        }
+        if (message.description != null && message.hasOwnProperty("description"))
+            object.description = message.description;
+        if (message.about != null && message.hasOwnProperty("about"))
+            object.about = message.about;
+        if (message.status != null && message.hasOwnProperty("status"))
+            object.status = message.status;
+        if (message.statusMessage != null && message.hasOwnProperty("statusMessage"))
+            object.statusMessage = message.statusMessage;
+        return object;
+    };
+
+    /**
+     * Converts this WorkingGroupMetadata to JSON.
+     * @function toJSON
+     * @memberof WorkingGroupMetadata
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    WorkingGroupMetadata.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    return WorkingGroupMetadata;
+})();
+
+$root.SetGroupMetadata = (function() {
+
+    /**
+     * Properties of a SetGroupMetadata.
+     * @exports ISetGroupMetadata
+     * @interface ISetGroupMetadata
+     * @property {IWorkingGroupMetadata} newMetadata SetGroupMetadata newMetadata
+     */
+
+    /**
+     * Constructs a new SetGroupMetadata.
+     * @exports SetGroupMetadata
+     * @classdesc Represents a SetGroupMetadata.
+     * @implements ISetGroupMetadata
+     * @constructor
+     * @param {ISetGroupMetadata=} [properties] Properties to set
+     */
+    function SetGroupMetadata(properties) {
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * SetGroupMetadata newMetadata.
+     * @member {IWorkingGroupMetadata} newMetadata
+     * @memberof SetGroupMetadata
+     * @instance
+     */
+    SetGroupMetadata.prototype.newMetadata = null;
+
+    /**
+     * Creates a new SetGroupMetadata instance using the specified properties.
+     * @function create
+     * @memberof SetGroupMetadata
+     * @static
+     * @param {ISetGroupMetadata=} [properties] Properties to set
+     * @returns {SetGroupMetadata} SetGroupMetadata instance
+     */
+    SetGroupMetadata.create = function create(properties) {
+        return new SetGroupMetadata(properties);
+    };
+
+    /**
+     * Encodes the specified SetGroupMetadata message. Does not implicitly {@link SetGroupMetadata.verify|verify} messages.
+     * @function encode
+     * @memberof SetGroupMetadata
+     * @static
+     * @param {ISetGroupMetadata} message SetGroupMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    SetGroupMetadata.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        $root.WorkingGroupMetadata.encode(message.newMetadata, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
+        return writer;
+    };
+
+    /**
+     * Encodes the specified SetGroupMetadata message, length delimited. Does not implicitly {@link SetGroupMetadata.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof SetGroupMetadata
+     * @static
+     * @param {ISetGroupMetadata} message SetGroupMetadata message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    SetGroupMetadata.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes a SetGroupMetadata message from the specified reader or buffer.
+     * @function decode
+     * @memberof SetGroupMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {SetGroupMetadata} SetGroupMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    SetGroupMetadata.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.SetGroupMetadata();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                message.newMetadata = $root.WorkingGroupMetadata.decode(reader, reader.uint32());
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        if (!message.hasOwnProperty("newMetadata"))
+            throw $util.ProtocolError("missing required 'newMetadata'", { instance: message });
+        return message;
+    };
+
+    /**
+     * Decodes a SetGroupMetadata message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof SetGroupMetadata
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {SetGroupMetadata} SetGroupMetadata
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    SetGroupMetadata.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies a SetGroupMetadata message.
+     * @function verify
+     * @memberof SetGroupMetadata
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    SetGroupMetadata.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        {
+            var error = $root.WorkingGroupMetadata.verify(message.newMetadata);
+            if (error)
+                return "newMetadata." + error;
+        }
+        return null;
+    };
+
+    /**
+     * Creates a SetGroupMetadata message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof SetGroupMetadata
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {SetGroupMetadata} SetGroupMetadata
+     */
+    SetGroupMetadata.fromObject = function fromObject(object) {
+        if (object instanceof $root.SetGroupMetadata)
+            return object;
+        var message = new $root.SetGroupMetadata();
+        if (object.newMetadata != null) {
+            if (typeof object.newMetadata !== "object")
+                throw TypeError(".SetGroupMetadata.newMetadata: object expected");
+            message.newMetadata = $root.WorkingGroupMetadata.fromObject(object.newMetadata);
+        }
+        return message;
+    };
+
+    /**
+     * Creates a plain object from a SetGroupMetadata message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof SetGroupMetadata
+     * @static
+     * @param {SetGroupMetadata} message SetGroupMetadata
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    SetGroupMetadata.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (options.defaults)
+            object.newMetadata = null;
+        if (message.newMetadata != null && message.hasOwnProperty("newMetadata"))
+            object.newMetadata = $root.WorkingGroupMetadata.toObject(message.newMetadata, options);
+        return object;
+    };
+
+    /**
+     * Converts this SetGroupMetadata to JSON.
+     * @function toJSON
+     * @memberof SetGroupMetadata
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    SetGroupMetadata.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    return SetGroupMetadata;
+})();
+
+$root.AddUpcomingOpening = (function() {
+
+    /**
+     * Properties of an AddUpcomingOpening.
+     * @exports IAddUpcomingOpening
+     * @interface IAddUpcomingOpening
+     * @property {IUpcomingOpeningMetadata} metadata AddUpcomingOpening metadata
+     */
+
+    /**
+     * Constructs a new AddUpcomingOpening.
+     * @exports AddUpcomingOpening
+     * @classdesc Represents an AddUpcomingOpening.
+     * @implements IAddUpcomingOpening
+     * @constructor
+     * @param {IAddUpcomingOpening=} [properties] Properties to set
+     */
+    function AddUpcomingOpening(properties) {
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * AddUpcomingOpening metadata.
+     * @member {IUpcomingOpeningMetadata} metadata
+     * @memberof AddUpcomingOpening
+     * @instance
+     */
+    AddUpcomingOpening.prototype.metadata = null;
+
+    /**
+     * Creates a new AddUpcomingOpening instance using the specified properties.
+     * @function create
+     * @memberof AddUpcomingOpening
+     * @static
+     * @param {IAddUpcomingOpening=} [properties] Properties to set
+     * @returns {AddUpcomingOpening} AddUpcomingOpening instance
+     */
+    AddUpcomingOpening.create = function create(properties) {
+        return new AddUpcomingOpening(properties);
+    };
+
+    /**
+     * Encodes the specified AddUpcomingOpening message. Does not implicitly {@link AddUpcomingOpening.verify|verify} messages.
+     * @function encode
+     * @memberof AddUpcomingOpening
+     * @static
+     * @param {IAddUpcomingOpening} message AddUpcomingOpening message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    AddUpcomingOpening.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        $root.UpcomingOpeningMetadata.encode(message.metadata, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
+        return writer;
+    };
+
+    /**
+     * Encodes the specified AddUpcomingOpening message, length delimited. Does not implicitly {@link AddUpcomingOpening.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof AddUpcomingOpening
+     * @static
+     * @param {IAddUpcomingOpening} message AddUpcomingOpening message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    AddUpcomingOpening.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes an AddUpcomingOpening message from the specified reader or buffer.
+     * @function decode
+     * @memberof AddUpcomingOpening
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {AddUpcomingOpening} AddUpcomingOpening
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    AddUpcomingOpening.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.AddUpcomingOpening();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                message.metadata = $root.UpcomingOpeningMetadata.decode(reader, reader.uint32());
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        if (!message.hasOwnProperty("metadata"))
+            throw $util.ProtocolError("missing required 'metadata'", { instance: message });
+        return message;
+    };
+
+    /**
+     * Decodes an AddUpcomingOpening message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof AddUpcomingOpening
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {AddUpcomingOpening} AddUpcomingOpening
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    AddUpcomingOpening.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies an AddUpcomingOpening message.
+     * @function verify
+     * @memberof AddUpcomingOpening
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    AddUpcomingOpening.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        {
+            var error = $root.UpcomingOpeningMetadata.verify(message.metadata);
+            if (error)
+                return "metadata." + error;
+        }
+        return null;
+    };
+
+    /**
+     * Creates an AddUpcomingOpening message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof AddUpcomingOpening
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {AddUpcomingOpening} AddUpcomingOpening
+     */
+    AddUpcomingOpening.fromObject = function fromObject(object) {
+        if (object instanceof $root.AddUpcomingOpening)
+            return object;
+        var message = new $root.AddUpcomingOpening();
+        if (object.metadata != null) {
+            if (typeof object.metadata !== "object")
+                throw TypeError(".AddUpcomingOpening.metadata: object expected");
+            message.metadata = $root.UpcomingOpeningMetadata.fromObject(object.metadata);
+        }
+        return message;
+    };
+
+    /**
+     * Creates a plain object from an AddUpcomingOpening message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof AddUpcomingOpening
+     * @static
+     * @param {AddUpcomingOpening} message AddUpcomingOpening
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    AddUpcomingOpening.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (options.defaults)
+            object.metadata = null;
+        if (message.metadata != null && message.hasOwnProperty("metadata"))
+            object.metadata = $root.UpcomingOpeningMetadata.toObject(message.metadata, options);
+        return object;
+    };
+
+    /**
+     * Converts this AddUpcomingOpening to JSON.
+     * @function toJSON
+     * @memberof AddUpcomingOpening
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    AddUpcomingOpening.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    return AddUpcomingOpening;
+})();
+
+$root.RemoveUpcomingOpening = (function() {
+
+    /**
+     * Properties of a RemoveUpcomingOpening.
+     * @exports IRemoveUpcomingOpening
+     * @interface IRemoveUpcomingOpening
+     * @property {string} id RemoveUpcomingOpening id
+     */
+
+    /**
+     * Constructs a new RemoveUpcomingOpening.
+     * @exports RemoveUpcomingOpening
+     * @classdesc Represents a RemoveUpcomingOpening.
+     * @implements IRemoveUpcomingOpening
+     * @constructor
+     * @param {IRemoveUpcomingOpening=} [properties] Properties to set
+     */
+    function RemoveUpcomingOpening(properties) {
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * RemoveUpcomingOpening id.
+     * @member {string} id
+     * @memberof RemoveUpcomingOpening
+     * @instance
+     */
+    RemoveUpcomingOpening.prototype.id = "";
+
+    /**
+     * Creates a new RemoveUpcomingOpening instance using the specified properties.
+     * @function create
+     * @memberof RemoveUpcomingOpening
+     * @static
+     * @param {IRemoveUpcomingOpening=} [properties] Properties to set
+     * @returns {RemoveUpcomingOpening} RemoveUpcomingOpening instance
+     */
+    RemoveUpcomingOpening.create = function create(properties) {
+        return new RemoveUpcomingOpening(properties);
+    };
+
+    /**
+     * Encodes the specified RemoveUpcomingOpening message. Does not implicitly {@link RemoveUpcomingOpening.verify|verify} messages.
+     * @function encode
+     * @memberof RemoveUpcomingOpening
+     * @static
+     * @param {IRemoveUpcomingOpening} message RemoveUpcomingOpening message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    RemoveUpcomingOpening.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
+        return writer;
+    };
+
+    /**
+     * Encodes the specified RemoveUpcomingOpening message, length delimited. Does not implicitly {@link RemoveUpcomingOpening.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof RemoveUpcomingOpening
+     * @static
+     * @param {IRemoveUpcomingOpening} message RemoveUpcomingOpening message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    RemoveUpcomingOpening.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes a RemoveUpcomingOpening message from the specified reader or buffer.
+     * @function decode
+     * @memberof RemoveUpcomingOpening
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {RemoveUpcomingOpening} RemoveUpcomingOpening
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    RemoveUpcomingOpening.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.RemoveUpcomingOpening();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                message.id = reader.string();
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        if (!message.hasOwnProperty("id"))
+            throw $util.ProtocolError("missing required 'id'", { instance: message });
+        return message;
+    };
+
+    /**
+     * Decodes a RemoveUpcomingOpening message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof RemoveUpcomingOpening
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {RemoveUpcomingOpening} RemoveUpcomingOpening
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    RemoveUpcomingOpening.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies a RemoveUpcomingOpening message.
+     * @function verify
+     * @memberof RemoveUpcomingOpening
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    RemoveUpcomingOpening.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        if (!$util.isString(message.id))
+            return "id: string expected";
+        return null;
+    };
+
+    /**
+     * Creates a RemoveUpcomingOpening message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof RemoveUpcomingOpening
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {RemoveUpcomingOpening} RemoveUpcomingOpening
+     */
+    RemoveUpcomingOpening.fromObject = function fromObject(object) {
+        if (object instanceof $root.RemoveUpcomingOpening)
+            return object;
+        var message = new $root.RemoveUpcomingOpening();
+        if (object.id != null)
+            message.id = String(object.id);
+        return message;
+    };
+
+    /**
+     * Creates a plain object from a RemoveUpcomingOpening message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof RemoveUpcomingOpening
+     * @static
+     * @param {RemoveUpcomingOpening} message RemoveUpcomingOpening
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    RemoveUpcomingOpening.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (options.defaults)
+            object.id = "";
+        if (message.id != null && message.hasOwnProperty("id"))
+            object.id = message.id;
+        return object;
+    };
+
+    /**
+     * Converts this RemoveUpcomingOpening to JSON.
+     * @function toJSON
+     * @memberof RemoveUpcomingOpening
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    RemoveUpcomingOpening.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    return RemoveUpcomingOpening;
+})();
+
+$root.WorkingGroupMetadataAction = (function() {
+
+    /**
+     * Properties of a WorkingGroupMetadataAction.
+     * @exports IWorkingGroupMetadataAction
+     * @interface IWorkingGroupMetadataAction
+     * @property {ISetGroupMetadata|null} [setGroupMetadata] WorkingGroupMetadataAction setGroupMetadata
+     * @property {IAddUpcomingOpening|null} [addUpcomingOpening] WorkingGroupMetadataAction addUpcomingOpening
+     * @property {IRemoveUpcomingOpening|null} [removeUpcomingOpening] WorkingGroupMetadataAction removeUpcomingOpening
+     */
+
+    /**
+     * Constructs a new WorkingGroupMetadataAction.
+     * @exports WorkingGroupMetadataAction
+     * @classdesc Represents a WorkingGroupMetadataAction.
+     * @implements IWorkingGroupMetadataAction
+     * @constructor
+     * @param {IWorkingGroupMetadataAction=} [properties] Properties to set
+     */
+    function WorkingGroupMetadataAction(properties) {
+        if (properties)
+            for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                if (properties[keys[i]] != null)
+                    this[keys[i]] = properties[keys[i]];
+    }
+
+    /**
+     * WorkingGroupMetadataAction setGroupMetadata.
+     * @member {ISetGroupMetadata|null|undefined} setGroupMetadata
+     * @memberof WorkingGroupMetadataAction
+     * @instance
+     */
+    WorkingGroupMetadataAction.prototype.setGroupMetadata = null;
+
+    /**
+     * WorkingGroupMetadataAction addUpcomingOpening.
+     * @member {IAddUpcomingOpening|null|undefined} addUpcomingOpening
+     * @memberof WorkingGroupMetadataAction
+     * @instance
+     */
+    WorkingGroupMetadataAction.prototype.addUpcomingOpening = null;
+
+    /**
+     * WorkingGroupMetadataAction removeUpcomingOpening.
+     * @member {IRemoveUpcomingOpening|null|undefined} removeUpcomingOpening
+     * @memberof WorkingGroupMetadataAction
+     * @instance
+     */
+    WorkingGroupMetadataAction.prototype.removeUpcomingOpening = null;
+
+    // OneOf field names bound to virtual getters and setters
+    var $oneOfFields;
+
+    /**
+     * WorkingGroupMetadataAction action.
+     * @member {"setGroupMetadata"|"addUpcomingOpening"|"removeUpcomingOpening"|undefined} action
+     * @memberof WorkingGroupMetadataAction
+     * @instance
+     */
+    Object.defineProperty(WorkingGroupMetadataAction.prototype, "action", {
+        get: $util.oneOfGetter($oneOfFields = ["setGroupMetadata", "addUpcomingOpening", "removeUpcomingOpening"]),
+        set: $util.oneOfSetter($oneOfFields)
+    });
+
+    /**
+     * Creates a new WorkingGroupMetadataAction instance using the specified properties.
+     * @function create
+     * @memberof WorkingGroupMetadataAction
+     * @static
+     * @param {IWorkingGroupMetadataAction=} [properties] Properties to set
+     * @returns {WorkingGroupMetadataAction} WorkingGroupMetadataAction instance
+     */
+    WorkingGroupMetadataAction.create = function create(properties) {
+        return new WorkingGroupMetadataAction(properties);
+    };
+
+    /**
+     * Encodes the specified WorkingGroupMetadataAction message. Does not implicitly {@link WorkingGroupMetadataAction.verify|verify} messages.
+     * @function encode
+     * @memberof WorkingGroupMetadataAction
+     * @static
+     * @param {IWorkingGroupMetadataAction} message WorkingGroupMetadataAction message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    WorkingGroupMetadataAction.encode = function encode(message, writer) {
+        if (!writer)
+            writer = $Writer.create();
+        if (message.setGroupMetadata != null && Object.hasOwnProperty.call(message, "setGroupMetadata"))
+            $root.SetGroupMetadata.encode(message.setGroupMetadata, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
+        if (message.addUpcomingOpening != null && Object.hasOwnProperty.call(message, "addUpcomingOpening"))
+            $root.AddUpcomingOpening.encode(message.addUpcomingOpening, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
+        if (message.removeUpcomingOpening != null && Object.hasOwnProperty.call(message, "removeUpcomingOpening"))
+            $root.RemoveUpcomingOpening.encode(message.removeUpcomingOpening, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
+        return writer;
+    };
+
+    /**
+     * Encodes the specified WorkingGroupMetadataAction message, length delimited. Does not implicitly {@link WorkingGroupMetadataAction.verify|verify} messages.
+     * @function encodeDelimited
+     * @memberof WorkingGroupMetadataAction
+     * @static
+     * @param {IWorkingGroupMetadataAction} message WorkingGroupMetadataAction message or plain object to encode
+     * @param {$protobuf.Writer} [writer] Writer to encode to
+     * @returns {$protobuf.Writer} Writer
+     */
+    WorkingGroupMetadataAction.encodeDelimited = function encodeDelimited(message, writer) {
+        return this.encode(message, writer).ldelim();
+    };
+
+    /**
+     * Decodes a WorkingGroupMetadataAction message from the specified reader or buffer.
+     * @function decode
+     * @memberof WorkingGroupMetadataAction
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @param {number} [length] Message length if known beforehand
+     * @returns {WorkingGroupMetadataAction} WorkingGroupMetadataAction
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    WorkingGroupMetadataAction.decode = function decode(reader, length) {
+        if (!(reader instanceof $Reader))
+            reader = $Reader.create(reader);
+        var end = length === undefined ? reader.len : reader.pos + length, message = new $root.WorkingGroupMetadataAction();
+        while (reader.pos < end) {
+            var tag = reader.uint32();
+            switch (tag >>> 3) {
+            case 1:
+                message.setGroupMetadata = $root.SetGroupMetadata.decode(reader, reader.uint32());
+                break;
+            case 2:
+                message.addUpcomingOpening = $root.AddUpcomingOpening.decode(reader, reader.uint32());
+                break;
+            case 3:
+                message.removeUpcomingOpening = $root.RemoveUpcomingOpening.decode(reader, reader.uint32());
+                break;
+            default:
+                reader.skipType(tag & 7);
+                break;
+            }
+        }
+        return message;
+    };
+
+    /**
+     * Decodes a WorkingGroupMetadataAction message from the specified reader or buffer, length delimited.
+     * @function decodeDelimited
+     * @memberof WorkingGroupMetadataAction
+     * @static
+     * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+     * @returns {WorkingGroupMetadataAction} WorkingGroupMetadataAction
+     * @throws {Error} If the payload is not a reader or valid buffer
+     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+     */
+    WorkingGroupMetadataAction.decodeDelimited = function decodeDelimited(reader) {
+        if (!(reader instanceof $Reader))
+            reader = new $Reader(reader);
+        return this.decode(reader, reader.uint32());
+    };
+
+    /**
+     * Verifies a WorkingGroupMetadataAction message.
+     * @function verify
+     * @memberof WorkingGroupMetadataAction
+     * @static
+     * @param {Object.<string,*>} message Plain object to verify
+     * @returns {string|null} `null` if valid, otherwise the reason why it is not
+     */
+    WorkingGroupMetadataAction.verify = function verify(message) {
+        if (typeof message !== "object" || message === null)
+            return "object expected";
+        var properties = {};
+        if (message.setGroupMetadata != null && message.hasOwnProperty("setGroupMetadata")) {
+            properties.action = 1;
+            {
+                var error = $root.SetGroupMetadata.verify(message.setGroupMetadata);
+                if (error)
+                    return "setGroupMetadata." + error;
+            }
+        }
+        if (message.addUpcomingOpening != null && message.hasOwnProperty("addUpcomingOpening")) {
+            if (properties.action === 1)
+                return "action: multiple values";
+            properties.action = 1;
+            {
+                var error = $root.AddUpcomingOpening.verify(message.addUpcomingOpening);
+                if (error)
+                    return "addUpcomingOpening." + error;
+            }
+        }
+        if (message.removeUpcomingOpening != null && message.hasOwnProperty("removeUpcomingOpening")) {
+            if (properties.action === 1)
+                return "action: multiple values";
+            properties.action = 1;
+            {
+                var error = $root.RemoveUpcomingOpening.verify(message.removeUpcomingOpening);
+                if (error)
+                    return "removeUpcomingOpening." + error;
+            }
+        }
+        return null;
+    };
+
+    /**
+     * Creates a WorkingGroupMetadataAction message from a plain object. Also converts values to their respective internal types.
+     * @function fromObject
+     * @memberof WorkingGroupMetadataAction
+     * @static
+     * @param {Object.<string,*>} object Plain object
+     * @returns {WorkingGroupMetadataAction} WorkingGroupMetadataAction
+     */
+    WorkingGroupMetadataAction.fromObject = function fromObject(object) {
+        if (object instanceof $root.WorkingGroupMetadataAction)
+            return object;
+        var message = new $root.WorkingGroupMetadataAction();
+        if (object.setGroupMetadata != null) {
+            if (typeof object.setGroupMetadata !== "object")
+                throw TypeError(".WorkingGroupMetadataAction.setGroupMetadata: object expected");
+            message.setGroupMetadata = $root.SetGroupMetadata.fromObject(object.setGroupMetadata);
+        }
+        if (object.addUpcomingOpening != null) {
+            if (typeof object.addUpcomingOpening !== "object")
+                throw TypeError(".WorkingGroupMetadataAction.addUpcomingOpening: object expected");
+            message.addUpcomingOpening = $root.AddUpcomingOpening.fromObject(object.addUpcomingOpening);
+        }
+        if (object.removeUpcomingOpening != null) {
+            if (typeof object.removeUpcomingOpening !== "object")
+                throw TypeError(".WorkingGroupMetadataAction.removeUpcomingOpening: object expected");
+            message.removeUpcomingOpening = $root.RemoveUpcomingOpening.fromObject(object.removeUpcomingOpening);
+        }
+        return message;
+    };
+
+    /**
+     * Creates a plain object from a WorkingGroupMetadataAction message. Also converts values to other types if specified.
+     * @function toObject
+     * @memberof WorkingGroupMetadataAction
+     * @static
+     * @param {WorkingGroupMetadataAction} message WorkingGroupMetadataAction
+     * @param {$protobuf.IConversionOptions} [options] Conversion options
+     * @returns {Object.<string,*>} Plain object
+     */
+    WorkingGroupMetadataAction.toObject = function toObject(message, options) {
+        if (!options)
+            options = {};
+        var object = {};
+        if (message.setGroupMetadata != null && message.hasOwnProperty("setGroupMetadata")) {
+            object.setGroupMetadata = $root.SetGroupMetadata.toObject(message.setGroupMetadata, options);
+            if (options.oneofs)
+                object.action = "setGroupMetadata";
+        }
+        if (message.addUpcomingOpening != null && message.hasOwnProperty("addUpcomingOpening")) {
+            object.addUpcomingOpening = $root.AddUpcomingOpening.toObject(message.addUpcomingOpening, options);
+            if (options.oneofs)
+                object.action = "addUpcomingOpening";
+        }
+        if (message.removeUpcomingOpening != null && message.hasOwnProperty("removeUpcomingOpening")) {
+            object.removeUpcomingOpening = $root.RemoveUpcomingOpening.toObject(message.removeUpcomingOpening, options);
+            if (options.oneofs)
+                object.action = "removeUpcomingOpening";
+        }
+        return object;
+    };
+
+    /**
+     * Converts this WorkingGroupMetadataAction to JSON.
+     * @function toJSON
+     * @memberof WorkingGroupMetadataAction
+     * @instance
+     * @returns {Object.<string,*>} JSON object
+     */
+    WorkingGroupMetadataAction.prototype.toJSON = function toJSON() {
+        return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+    };
+
+    return WorkingGroupMetadataAction;
+})();
+
+module.exports = $root;

+ 0 - 45
metadata-protobuf/compiled/proto/Council_pb.d.ts

@@ -1,45 +0,0 @@
-// package: 
-// file: proto/Council.proto
-
-import * as jspb from "google-protobuf";
-
-export class CouncilCandidacyNoteMetadata extends jspb.Message {
-  hasHeader(): boolean;
-  clearHeader(): void;
-  getHeader(): string | undefined;
-  setHeader(value: string): void;
-
-  clearBulletPointsList(): void;
-  getBulletPointsList(): Array<string>;
-  setBulletPointsList(value: Array<string>): void;
-  addBulletPoints(value: string, index?: number): string;
-
-  hasBannerImageUri(): boolean;
-  clearBannerImageUri(): void;
-  getBannerImageUri(): string | undefined;
-  setBannerImageUri(value: string): void;
-
-  hasDescription(): boolean;
-  clearDescription(): void;
-  getDescription(): string | undefined;
-  setDescription(value: string): void;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): CouncilCandidacyNoteMetadata.AsObject;
-  static toObject(includeInstance: boolean, msg: CouncilCandidacyNoteMetadata): CouncilCandidacyNoteMetadata.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: CouncilCandidacyNoteMetadata, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): CouncilCandidacyNoteMetadata;
-  static deserializeBinaryFromReader(message: CouncilCandidacyNoteMetadata, reader: jspb.BinaryReader): CouncilCandidacyNoteMetadata;
-}
-
-export namespace CouncilCandidacyNoteMetadata {
-  export type AsObject = {
-    header?: string,
-    bulletPointsList: Array<string>,
-    bannerImageUri?: string,
-    description?: string,
-  }
-}
-

+ 0 - 340
metadata-protobuf/compiled/proto/Council_pb.js

@@ -1,340 +0,0 @@
-// source: proto/Council.proto
-/**
- * @fileoverview
- * @enhanceable
- * @suppress {missingRequire} reports error on implicit type usages.
- * @suppress {messageConventions} JS Compiler reports an error if a variable or
- *     field starts with 'MSG_' and isn't a translatable message.
- * @public
- */
-// GENERATED CODE -- DO NOT EDIT!
-/* eslint-disable */
-// @ts-nocheck
-
-var jspb = require('google-protobuf');
-var goog = jspb;
-var global = Function('return this')();
-
-goog.exportSymbol('proto.CouncilCandidacyNoteMetadata', null, global);
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.CouncilCandidacyNoteMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, proto.CouncilCandidacyNoteMetadata.repeatedFields_, null);
-};
-goog.inherits(proto.CouncilCandidacyNoteMetadata, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.CouncilCandidacyNoteMetadata.displayName = 'proto.CouncilCandidacyNoteMetadata';
-}
-
-/**
- * List of repeated fields within this message type.
- * @private {!Array<number>}
- * @const
- */
-proto.CouncilCandidacyNoteMetadata.repeatedFields_ = [2];
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.CouncilCandidacyNoteMetadata.prototype.toObject = function(opt_includeInstance) {
-  return proto.CouncilCandidacyNoteMetadata.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.CouncilCandidacyNoteMetadata} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.CouncilCandidacyNoteMetadata.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    header: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
-    bulletPointsList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f,
-    bannerImageUri: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f,
-    description: (f = jspb.Message.getField(msg, 4)) == null ? undefined : f
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.CouncilCandidacyNoteMetadata}
- */
-proto.CouncilCandidacyNoteMetadata.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.CouncilCandidacyNoteMetadata;
-  return proto.CouncilCandidacyNoteMetadata.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.CouncilCandidacyNoteMetadata} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.CouncilCandidacyNoteMetadata}
- */
-proto.CouncilCandidacyNoteMetadata.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setHeader(value);
-      break;
-    case 2:
-      var value = /** @type {string} */ (reader.readString());
-      msg.addBulletPoints(value);
-      break;
-    case 3:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setBannerImageUri(value);
-      break;
-    case 4:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setDescription(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.CouncilCandidacyNoteMetadata.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.CouncilCandidacyNoteMetadata.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.CouncilCandidacyNoteMetadata} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.CouncilCandidacyNoteMetadata.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = /** @type {string} */ (jspb.Message.getField(message, 1));
-  if (f != null) {
-    writer.writeString(
-      1,
-      f
-    );
-  }
-  f = message.getBulletPointsList();
-  if (f.length > 0) {
-    writer.writeRepeatedString(
-      2,
-      f
-    );
-  }
-  f = /** @type {string} */ (jspb.Message.getField(message, 3));
-  if (f != null) {
-    writer.writeString(
-      3,
-      f
-    );
-  }
-  f = /** @type {string} */ (jspb.Message.getField(message, 4));
-  if (f != null) {
-    writer.writeString(
-      4,
-      f
-    );
-  }
-};
-
-
-/**
- * optional string header = 1;
- * @return {string}
- */
-proto.CouncilCandidacyNoteMetadata.prototype.getHeader = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.CouncilCandidacyNoteMetadata} returns this
- */
-proto.CouncilCandidacyNoteMetadata.prototype.setHeader = function(value) {
-  return jspb.Message.setField(this, 1, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.CouncilCandidacyNoteMetadata} returns this
- */
-proto.CouncilCandidacyNoteMetadata.prototype.clearHeader = function() {
-  return jspb.Message.setField(this, 1, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.CouncilCandidacyNoteMetadata.prototype.hasHeader = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-/**
- * repeated string bullet_points = 2;
- * @return {!Array<string>}
- */
-proto.CouncilCandidacyNoteMetadata.prototype.getBulletPointsList = function() {
-  return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2));
-};
-
-
-/**
- * @param {!Array<string>} value
- * @return {!proto.CouncilCandidacyNoteMetadata} returns this
- */
-proto.CouncilCandidacyNoteMetadata.prototype.setBulletPointsList = function(value) {
-  return jspb.Message.setField(this, 2, value || []);
-};
-
-
-/**
- * @param {string} value
- * @param {number=} opt_index
- * @return {!proto.CouncilCandidacyNoteMetadata} returns this
- */
-proto.CouncilCandidacyNoteMetadata.prototype.addBulletPoints = function(value, opt_index) {
-  return jspb.Message.addToRepeatedField(this, 2, value, opt_index);
-};
-
-
-/**
- * Clears the list making it empty but non-null.
- * @return {!proto.CouncilCandidacyNoteMetadata} returns this
- */
-proto.CouncilCandidacyNoteMetadata.prototype.clearBulletPointsList = function() {
-  return this.setBulletPointsList([]);
-};
-
-
-/**
- * optional string banner_image_uri = 3;
- * @return {string}
- */
-proto.CouncilCandidacyNoteMetadata.prototype.getBannerImageUri = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.CouncilCandidacyNoteMetadata} returns this
- */
-proto.CouncilCandidacyNoteMetadata.prototype.setBannerImageUri = function(value) {
-  return jspb.Message.setField(this, 3, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.CouncilCandidacyNoteMetadata} returns this
- */
-proto.CouncilCandidacyNoteMetadata.prototype.clearBannerImageUri = function() {
-  return jspb.Message.setField(this, 3, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.CouncilCandidacyNoteMetadata.prototype.hasBannerImageUri = function() {
-  return jspb.Message.getField(this, 3) != null;
-};
-
-
-/**
- * optional string description = 4;
- * @return {string}
- */
-proto.CouncilCandidacyNoteMetadata.prototype.getDescription = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.CouncilCandidacyNoteMetadata} returns this
- */
-proto.CouncilCandidacyNoteMetadata.prototype.setDescription = function(value) {
-  return jspb.Message.setField(this, 4, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.CouncilCandidacyNoteMetadata} returns this
- */
-proto.CouncilCandidacyNoteMetadata.prototype.clearDescription = function() {
-  return jspb.Message.setField(this, 4, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.CouncilCandidacyNoteMetadata.prototype.hasDescription = function() {
-  return jspb.Message.getField(this, 4) != null;
-};
-
-
-goog.object.extend(exports, proto);

+ 0 - 39
metadata-protobuf/compiled/proto/Membership_pb.d.ts

@@ -1,39 +0,0 @@
-// package: 
-// file: proto/Membership.proto
-
-import * as jspb from "google-protobuf";
-
-export class MembershipMetadata extends jspb.Message {
-  hasName(): boolean;
-  clearName(): void;
-  getName(): string | undefined;
-  setName(value: string): void;
-
-  hasAvatar(): boolean;
-  clearAvatar(): void;
-  getAvatar(): number | undefined;
-  setAvatar(value: number): void;
-
-  hasAbout(): boolean;
-  clearAbout(): void;
-  getAbout(): string | undefined;
-  setAbout(value: string): void;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): MembershipMetadata.AsObject;
-  static toObject(includeInstance: boolean, msg: MembershipMetadata): MembershipMetadata.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: MembershipMetadata, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): MembershipMetadata;
-  static deserializeBinaryFromReader(message: MembershipMetadata, reader: jspb.BinaryReader): MembershipMetadata;
-}
-
-export namespace MembershipMetadata {
-  export type AsObject = {
-    name?: string,
-    avatar?: number,
-    about?: string,
-  }
-}
-

+ 0 - 284
metadata-protobuf/compiled/proto/Membership_pb.js

@@ -1,284 +0,0 @@
-// source: proto/Membership.proto
-/**
- * @fileoverview
- * @enhanceable
- * @suppress {missingRequire} reports error on implicit type usages.
- * @suppress {messageConventions} JS Compiler reports an error if a variable or
- *     field starts with 'MSG_' and isn't a translatable message.
- * @public
- */
-// GENERATED CODE -- DO NOT EDIT!
-/* eslint-disable */
-// @ts-nocheck
-
-var jspb = require('google-protobuf');
-var goog = jspb;
-var global = Function('return this')();
-
-goog.exportSymbol('proto.MembershipMetadata', null, global);
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.MembershipMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.MembershipMetadata, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.MembershipMetadata.displayName = 'proto.MembershipMetadata';
-}
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.MembershipMetadata.prototype.toObject = function(opt_includeInstance) {
-  return proto.MembershipMetadata.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.MembershipMetadata} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.MembershipMetadata.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    name: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
-    avatar: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
-    about: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.MembershipMetadata}
- */
-proto.MembershipMetadata.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.MembershipMetadata;
-  return proto.MembershipMetadata.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.MembershipMetadata} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.MembershipMetadata}
- */
-proto.MembershipMetadata.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setName(value);
-      break;
-    case 2:
-      var value = /** @type {number} */ (reader.readUint32());
-      msg.setAvatar(value);
-      break;
-    case 3:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setAbout(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.MembershipMetadata.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.MembershipMetadata.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.MembershipMetadata} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.MembershipMetadata.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = /** @type {string} */ (jspb.Message.getField(message, 1));
-  if (f != null) {
-    writer.writeString(
-      1,
-      f
-    );
-  }
-  f = /** @type {number} */ (jspb.Message.getField(message, 2));
-  if (f != null) {
-    writer.writeUint32(
-      2,
-      f
-    );
-  }
-  f = /** @type {string} */ (jspb.Message.getField(message, 3));
-  if (f != null) {
-    writer.writeString(
-      3,
-      f
-    );
-  }
-};
-
-
-/**
- * optional string name = 1;
- * @return {string}
- */
-proto.MembershipMetadata.prototype.getName = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.MembershipMetadata} returns this
- */
-proto.MembershipMetadata.prototype.setName = function(value) {
-  return jspb.Message.setField(this, 1, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.MembershipMetadata} returns this
- */
-proto.MembershipMetadata.prototype.clearName = function() {
-  return jspb.Message.setField(this, 1, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.MembershipMetadata.prototype.hasName = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-/**
- * optional uint32 avatar = 2;
- * @return {number}
- */
-proto.MembershipMetadata.prototype.getAvatar = function() {
-  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
-};
-
-
-/**
- * @param {number} value
- * @return {!proto.MembershipMetadata} returns this
- */
-proto.MembershipMetadata.prototype.setAvatar = function(value) {
-  return jspb.Message.setField(this, 2, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.MembershipMetadata} returns this
- */
-proto.MembershipMetadata.prototype.clearAvatar = function() {
-  return jspb.Message.setField(this, 2, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.MembershipMetadata.prototype.hasAvatar = function() {
-  return jspb.Message.getField(this, 2) != null;
-};
-
-
-/**
- * optional string about = 3;
- * @return {string}
- */
-proto.MembershipMetadata.prototype.getAbout = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.MembershipMetadata} returns this
- */
-proto.MembershipMetadata.prototype.setAbout = function(value) {
-  return jspb.Message.setField(this, 3, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.MembershipMetadata} returns this
- */
-proto.MembershipMetadata.prototype.clearAbout = function() {
-  return jspb.Message.setField(this, 3, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.MembershipMetadata.prototype.hasAbout = function() {
-  return jspb.Message.getField(this, 3) != null;
-};
-
-
-goog.object.extend(exports, proto);

+ 0 - 302
metadata-protobuf/compiled/proto/WorkingGroups_pb.d.ts

@@ -1,302 +0,0 @@
-// package: 
-// file: proto/WorkingGroups.proto
-
-import * as jspb from "google-protobuf";
-
-export class OpeningMetadata extends jspb.Message {
-  hasShortDescription(): boolean;
-  clearShortDescription(): void;
-  getShortDescription(): string | undefined;
-  setShortDescription(value: string): void;
-
-  hasDescription(): boolean;
-  clearDescription(): void;
-  getDescription(): string | undefined;
-  setDescription(value: string): void;
-
-  hasHiringLimit(): boolean;
-  clearHiringLimit(): void;
-  getHiringLimit(): number | undefined;
-  setHiringLimit(value: number): void;
-
-  hasExpectedEndingTimestamp(): boolean;
-  clearExpectedEndingTimestamp(): void;
-  getExpectedEndingTimestamp(): number | undefined;
-  setExpectedEndingTimestamp(value: number): void;
-
-  hasApplicationDetails(): boolean;
-  clearApplicationDetails(): void;
-  getApplicationDetails(): string | undefined;
-  setApplicationDetails(value: string): void;
-
-  clearApplicationFormQuestionsList(): void;
-  getApplicationFormQuestionsList(): Array<OpeningMetadata.ApplicationFormQuestion>;
-  setApplicationFormQuestionsList(value: Array<OpeningMetadata.ApplicationFormQuestion>): void;
-  addApplicationFormQuestions(value?: OpeningMetadata.ApplicationFormQuestion, index?: number): OpeningMetadata.ApplicationFormQuestion;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): OpeningMetadata.AsObject;
-  static toObject(includeInstance: boolean, msg: OpeningMetadata): OpeningMetadata.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: OpeningMetadata, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): OpeningMetadata;
-  static deserializeBinaryFromReader(message: OpeningMetadata, reader: jspb.BinaryReader): OpeningMetadata;
-}
-
-export namespace OpeningMetadata {
-  export type AsObject = {
-    shortDescription?: string,
-    description?: string,
-    hiringLimit?: number,
-    expectedEndingTimestamp?: number,
-    applicationDetails?: string,
-    applicationFormQuestionsList: Array<OpeningMetadata.ApplicationFormQuestion.AsObject>,
-  }
-
-  export class ApplicationFormQuestion extends jspb.Message {
-    hasQuestion(): boolean;
-    clearQuestion(): void;
-    getQuestion(): string | undefined;
-    setQuestion(value: string): void;
-
-    hasType(): boolean;
-    clearType(): void;
-    getType(): OpeningMetadata.ApplicationFormQuestion.InputTypeMap[keyof OpeningMetadata.ApplicationFormQuestion.InputTypeMap] | undefined;
-    setType(value: OpeningMetadata.ApplicationFormQuestion.InputTypeMap[keyof OpeningMetadata.ApplicationFormQuestion.InputTypeMap]): void;
-
-    serializeBinary(): Uint8Array;
-    toObject(includeInstance?: boolean): ApplicationFormQuestion.AsObject;
-    static toObject(includeInstance: boolean, msg: ApplicationFormQuestion): ApplicationFormQuestion.AsObject;
-    static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-    static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-    static serializeBinaryToWriter(message: ApplicationFormQuestion, writer: jspb.BinaryWriter): void;
-    static deserializeBinary(bytes: Uint8Array): ApplicationFormQuestion;
-    static deserializeBinaryFromReader(message: ApplicationFormQuestion, reader: jspb.BinaryReader): ApplicationFormQuestion;
-  }
-
-  export namespace ApplicationFormQuestion {
-    export type AsObject = {
-      question?: string,
-      type?: OpeningMetadata.ApplicationFormQuestion.InputTypeMap[keyof OpeningMetadata.ApplicationFormQuestion.InputTypeMap],
-    }
-
-    export interface InputTypeMap {
-      TEXT: 1;
-      TEXTAREA: 2;
-    }
-
-    export const InputType: InputTypeMap;
-  }
-}
-
-export class UpcomingOpeningMetadata extends jspb.Message {
-  hasExpectedStart(): boolean;
-  clearExpectedStart(): void;
-  getExpectedStart(): number | undefined;
-  setExpectedStart(value: number): void;
-
-  hasRewardPerBlock(): boolean;
-  clearRewardPerBlock(): void;
-  getRewardPerBlock(): number | undefined;
-  setRewardPerBlock(value: number): void;
-
-  hasMinApplicationStake(): boolean;
-  clearMinApplicationStake(): void;
-  getMinApplicationStake(): number | undefined;
-  setMinApplicationStake(value: number): void;
-
-  hasMetadata(): boolean;
-  clearMetadata(): void;
-  getMetadata(): OpeningMetadata;
-  setMetadata(value?: OpeningMetadata): void;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): UpcomingOpeningMetadata.AsObject;
-  static toObject(includeInstance: boolean, msg: UpcomingOpeningMetadata): UpcomingOpeningMetadata.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: UpcomingOpeningMetadata, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): UpcomingOpeningMetadata;
-  static deserializeBinaryFromReader(message: UpcomingOpeningMetadata, reader: jspb.BinaryReader): UpcomingOpeningMetadata;
-}
-
-export namespace UpcomingOpeningMetadata {
-  export type AsObject = {
-    expectedStart?: number,
-    rewardPerBlock?: number,
-    minApplicationStake?: number,
-    metadata: OpeningMetadata.AsObject,
-  }
-}
-
-export class ApplicationMetadata extends jspb.Message {
-  clearAnswersList(): void;
-  getAnswersList(): Array<string>;
-  setAnswersList(value: Array<string>): void;
-  addAnswers(value: string, index?: number): string;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): ApplicationMetadata.AsObject;
-  static toObject(includeInstance: boolean, msg: ApplicationMetadata): ApplicationMetadata.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: ApplicationMetadata, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): ApplicationMetadata;
-  static deserializeBinaryFromReader(message: ApplicationMetadata, reader: jspb.BinaryReader): ApplicationMetadata;
-}
-
-export namespace ApplicationMetadata {
-  export type AsObject = {
-    answersList: Array<string>,
-  }
-}
-
-export class WorkingGroupMetadata extends jspb.Message {
-  hasDescription(): boolean;
-  clearDescription(): void;
-  getDescription(): string | undefined;
-  setDescription(value: string): void;
-
-  hasAbout(): boolean;
-  clearAbout(): void;
-  getAbout(): string | undefined;
-  setAbout(value: string): void;
-
-  hasStatus(): boolean;
-  clearStatus(): void;
-  getStatus(): string | undefined;
-  setStatus(value: string): void;
-
-  hasStatusMessage(): boolean;
-  clearStatusMessage(): void;
-  getStatusMessage(): string | undefined;
-  setStatusMessage(value: string): void;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): WorkingGroupMetadata.AsObject;
-  static toObject(includeInstance: boolean, msg: WorkingGroupMetadata): WorkingGroupMetadata.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: WorkingGroupMetadata, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): WorkingGroupMetadata;
-  static deserializeBinaryFromReader(message: WorkingGroupMetadata, reader: jspb.BinaryReader): WorkingGroupMetadata;
-}
-
-export namespace WorkingGroupMetadata {
-  export type AsObject = {
-    description?: string,
-    about?: string,
-    status?: string,
-    statusMessage?: string,
-  }
-}
-
-export class SetGroupMetadata extends jspb.Message {
-  hasNewMetadata(): boolean;
-  clearNewMetadata(): void;
-  getNewMetadata(): WorkingGroupMetadata;
-  setNewMetadata(value?: WorkingGroupMetadata): void;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): SetGroupMetadata.AsObject;
-  static toObject(includeInstance: boolean, msg: SetGroupMetadata): SetGroupMetadata.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: SetGroupMetadata, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): SetGroupMetadata;
-  static deserializeBinaryFromReader(message: SetGroupMetadata, reader: jspb.BinaryReader): SetGroupMetadata;
-}
-
-export namespace SetGroupMetadata {
-  export type AsObject = {
-    newMetadata: WorkingGroupMetadata.AsObject,
-  }
-}
-
-export class AddUpcomingOpening extends jspb.Message {
-  hasMetadata(): boolean;
-  clearMetadata(): void;
-  getMetadata(): UpcomingOpeningMetadata;
-  setMetadata(value?: UpcomingOpeningMetadata): void;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): AddUpcomingOpening.AsObject;
-  static toObject(includeInstance: boolean, msg: AddUpcomingOpening): AddUpcomingOpening.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: AddUpcomingOpening, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): AddUpcomingOpening;
-  static deserializeBinaryFromReader(message: AddUpcomingOpening, reader: jspb.BinaryReader): AddUpcomingOpening;
-}
-
-export namespace AddUpcomingOpening {
-  export type AsObject = {
-    metadata: UpcomingOpeningMetadata.AsObject,
-  }
-}
-
-export class RemoveUpcomingOpening extends jspb.Message {
-  hasId(): boolean;
-  clearId(): void;
-  getId(): string | undefined;
-  setId(value: string): void;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): RemoveUpcomingOpening.AsObject;
-  static toObject(includeInstance: boolean, msg: RemoveUpcomingOpening): RemoveUpcomingOpening.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: RemoveUpcomingOpening, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): RemoveUpcomingOpening;
-  static deserializeBinaryFromReader(message: RemoveUpcomingOpening, reader: jspb.BinaryReader): RemoveUpcomingOpening;
-}
-
-export namespace RemoveUpcomingOpening {
-  export type AsObject = {
-    id?: string,
-  }
-}
-
-export class WorkingGroupMetadataAction extends jspb.Message {
-  hasSetGroupMetadata(): boolean;
-  clearSetGroupMetadata(): void;
-  getSetGroupMetadata(): SetGroupMetadata | undefined;
-  setSetGroupMetadata(value?: SetGroupMetadata): void;
-
-  hasAddUpcomingOpening(): boolean;
-  clearAddUpcomingOpening(): void;
-  getAddUpcomingOpening(): AddUpcomingOpening | undefined;
-  setAddUpcomingOpening(value?: AddUpcomingOpening): void;
-
-  hasRemoveUpcomingOpening(): boolean;
-  clearRemoveUpcomingOpening(): void;
-  getRemoveUpcomingOpening(): RemoveUpcomingOpening | undefined;
-  setRemoveUpcomingOpening(value?: RemoveUpcomingOpening): void;
-
-  getActionCase(): WorkingGroupMetadataAction.ActionCase;
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): WorkingGroupMetadataAction.AsObject;
-  static toObject(includeInstance: boolean, msg: WorkingGroupMetadataAction): WorkingGroupMetadataAction.AsObject;
-  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
-  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
-  static serializeBinaryToWriter(message: WorkingGroupMetadataAction, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): WorkingGroupMetadataAction;
-  static deserializeBinaryFromReader(message: WorkingGroupMetadataAction, reader: jspb.BinaryReader): WorkingGroupMetadataAction;
-}
-
-export namespace WorkingGroupMetadataAction {
-  export type AsObject = {
-    setGroupMetadata?: SetGroupMetadata.AsObject,
-    addUpcomingOpening?: AddUpcomingOpening.AsObject,
-    removeUpcomingOpening?: RemoveUpcomingOpening.AsObject,
-  }
-
-  export enum ActionCase {
-    ACTION_NOT_SET = 0,
-    SET_GROUP_METADATA = 1,
-    ADD_UPCOMING_OPENING = 2,
-    REMOVE_UPCOMING_OPENING = 3,
-  }
-}
-

+ 0 - 2295
metadata-protobuf/compiled/proto/WorkingGroups_pb.js

@@ -1,2295 +0,0 @@
-// source: proto/WorkingGroups.proto
-/**
- * @fileoverview
- * @enhanceable
- * @suppress {missingRequire} reports error on implicit type usages.
- * @suppress {messageConventions} JS Compiler reports an error if a variable or
- *     field starts with 'MSG_' and isn't a translatable message.
- * @public
- */
-// GENERATED CODE -- DO NOT EDIT!
-/* eslint-disable */
-// @ts-nocheck
-
-var jspb = require('google-protobuf');
-var goog = jspb;
-var global = Function('return this')();
-
-goog.exportSymbol('proto.AddUpcomingOpening', null, global);
-goog.exportSymbol('proto.ApplicationMetadata', null, global);
-goog.exportSymbol('proto.OpeningMetadata', null, global);
-goog.exportSymbol('proto.OpeningMetadata.ApplicationFormQuestion', null, global);
-goog.exportSymbol('proto.OpeningMetadata.ApplicationFormQuestion.InputType', null, global);
-goog.exportSymbol('proto.RemoveUpcomingOpening', null, global);
-goog.exportSymbol('proto.SetGroupMetadata', null, global);
-goog.exportSymbol('proto.UpcomingOpeningMetadata', null, global);
-goog.exportSymbol('proto.WorkingGroupMetadata', null, global);
-goog.exportSymbol('proto.WorkingGroupMetadataAction', null, global);
-goog.exportSymbol('proto.WorkingGroupMetadataAction.ActionCase', null, global);
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.OpeningMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, proto.OpeningMetadata.repeatedFields_, null);
-};
-goog.inherits(proto.OpeningMetadata, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.OpeningMetadata.displayName = 'proto.OpeningMetadata';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.OpeningMetadata.ApplicationFormQuestion = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.OpeningMetadata.ApplicationFormQuestion, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.OpeningMetadata.ApplicationFormQuestion.displayName = 'proto.OpeningMetadata.ApplicationFormQuestion';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.UpcomingOpeningMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.UpcomingOpeningMetadata, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.UpcomingOpeningMetadata.displayName = 'proto.UpcomingOpeningMetadata';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.ApplicationMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, proto.ApplicationMetadata.repeatedFields_, null);
-};
-goog.inherits(proto.ApplicationMetadata, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.ApplicationMetadata.displayName = 'proto.ApplicationMetadata';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.WorkingGroupMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.WorkingGroupMetadata, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.WorkingGroupMetadata.displayName = 'proto.WorkingGroupMetadata';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.SetGroupMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.SetGroupMetadata, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.SetGroupMetadata.displayName = 'proto.SetGroupMetadata';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.AddUpcomingOpening = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.AddUpcomingOpening, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.AddUpcomingOpening.displayName = 'proto.AddUpcomingOpening';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.RemoveUpcomingOpening = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
-};
-goog.inherits(proto.RemoveUpcomingOpening, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.RemoveUpcomingOpening.displayName = 'proto.RemoveUpcomingOpening';
-}
-/**
- * Generated by JsPbCodeGenerator.
- * @param {Array=} opt_data Optional initial data array, typically from a
- * server response, or constructed directly in Javascript. The array is used
- * in place and becomes part of the constructed object. It is not cloned.
- * If no data is provided, the constructed object will be empty, but still
- * valid.
- * @extends {jspb.Message}
- * @constructor
- */
-proto.WorkingGroupMetadataAction = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, proto.WorkingGroupMetadataAction.oneofGroups_);
-};
-goog.inherits(proto.WorkingGroupMetadataAction, jspb.Message);
-if (goog.DEBUG && !COMPILED) {
-  /**
-   * @public
-   * @override
-   */
-  proto.WorkingGroupMetadataAction.displayName = 'proto.WorkingGroupMetadataAction';
-}
-
-/**
- * List of repeated fields within this message type.
- * @private {!Array<number>}
- * @const
- */
-proto.OpeningMetadata.repeatedFields_ = [6];
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.OpeningMetadata.prototype.toObject = function(opt_includeInstance) {
-  return proto.OpeningMetadata.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.OpeningMetadata} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.OpeningMetadata.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    shortDescription: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
-    description: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
-    hiringLimit: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f,
-    expectedEndingTimestamp: (f = jspb.Message.getField(msg, 4)) == null ? undefined : f,
-    applicationDetails: (f = jspb.Message.getField(msg, 5)) == null ? undefined : f,
-    applicationFormQuestionsList: jspb.Message.toObjectList(msg.getApplicationFormQuestionsList(),
-    proto.OpeningMetadata.ApplicationFormQuestion.toObject, includeInstance)
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.OpeningMetadata}
- */
-proto.OpeningMetadata.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.OpeningMetadata;
-  return proto.OpeningMetadata.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.OpeningMetadata} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.OpeningMetadata}
- */
-proto.OpeningMetadata.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setShortDescription(value);
-      break;
-    case 2:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setDescription(value);
-      break;
-    case 3:
-      var value = /** @type {number} */ (reader.readUint32());
-      msg.setHiringLimit(value);
-      break;
-    case 4:
-      var value = /** @type {number} */ (reader.readUint64());
-      msg.setExpectedEndingTimestamp(value);
-      break;
-    case 5:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setApplicationDetails(value);
-      break;
-    case 6:
-      var value = new proto.OpeningMetadata.ApplicationFormQuestion;
-      reader.readMessage(value,proto.OpeningMetadata.ApplicationFormQuestion.deserializeBinaryFromReader);
-      msg.addApplicationFormQuestions(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.OpeningMetadata.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.OpeningMetadata.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.OpeningMetadata} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.OpeningMetadata.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = /** @type {string} */ (jspb.Message.getField(message, 1));
-  if (f != null) {
-    writer.writeString(
-      1,
-      f
-    );
-  }
-  f = /** @type {string} */ (jspb.Message.getField(message, 2));
-  if (f != null) {
-    writer.writeString(
-      2,
-      f
-    );
-  }
-  f = /** @type {number} */ (jspb.Message.getField(message, 3));
-  if (f != null) {
-    writer.writeUint32(
-      3,
-      f
-    );
-  }
-  f = /** @type {number} */ (jspb.Message.getField(message, 4));
-  if (f != null) {
-    writer.writeUint64(
-      4,
-      f
-    );
-  }
-  f = /** @type {string} */ (jspb.Message.getField(message, 5));
-  if (f != null) {
-    writer.writeString(
-      5,
-      f
-    );
-  }
-  f = message.getApplicationFormQuestionsList();
-  if (f.length > 0) {
-    writer.writeRepeatedMessage(
-      6,
-      f,
-      proto.OpeningMetadata.ApplicationFormQuestion.serializeBinaryToWriter
-    );
-  }
-};
-
-
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.toObject = function(opt_includeInstance) {
-  return proto.OpeningMetadata.ApplicationFormQuestion.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.OpeningMetadata.ApplicationFormQuestion} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.OpeningMetadata.ApplicationFormQuestion.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    question: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
-    type: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.OpeningMetadata.ApplicationFormQuestion}
- */
-proto.OpeningMetadata.ApplicationFormQuestion.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.OpeningMetadata.ApplicationFormQuestion;
-  return proto.OpeningMetadata.ApplicationFormQuestion.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.OpeningMetadata.ApplicationFormQuestion} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.OpeningMetadata.ApplicationFormQuestion}
- */
-proto.OpeningMetadata.ApplicationFormQuestion.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setQuestion(value);
-      break;
-    case 2:
-      var value = /** @type {!proto.OpeningMetadata.ApplicationFormQuestion.InputType} */ (reader.readEnum());
-      msg.setType(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.OpeningMetadata.ApplicationFormQuestion.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.OpeningMetadata.ApplicationFormQuestion} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.OpeningMetadata.ApplicationFormQuestion.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = /** @type {string} */ (jspb.Message.getField(message, 1));
-  if (f != null) {
-    writer.writeString(
-      1,
-      f
-    );
-  }
-  f = /** @type {!proto.OpeningMetadata.ApplicationFormQuestion.InputType} */ (jspb.Message.getField(message, 2));
-  if (f != null) {
-    writer.writeEnum(
-      2,
-      f
-    );
-  }
-};
-
-
-/**
- * @enum {number}
- */
-proto.OpeningMetadata.ApplicationFormQuestion.InputType = {
-  TEXT: 1,
-  TEXTAREA: 2
-};
-
-/**
- * required string question = 1;
- * @return {string}
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.getQuestion = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.OpeningMetadata.ApplicationFormQuestion} returns this
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.setQuestion = function(value) {
-  return jspb.Message.setField(this, 1, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.OpeningMetadata.ApplicationFormQuestion} returns this
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.clearQuestion = function() {
-  return jspb.Message.setField(this, 1, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.hasQuestion = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-/**
- * required InputType type = 2;
- * @return {!proto.OpeningMetadata.ApplicationFormQuestion.InputType}
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.getType = function() {
-  return /** @type {!proto.OpeningMetadata.ApplicationFormQuestion.InputType} */ (jspb.Message.getFieldWithDefault(this, 2, 1));
-};
-
-
-/**
- * @param {!proto.OpeningMetadata.ApplicationFormQuestion.InputType} value
- * @return {!proto.OpeningMetadata.ApplicationFormQuestion} returns this
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.setType = function(value) {
-  return jspb.Message.setField(this, 2, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.OpeningMetadata.ApplicationFormQuestion} returns this
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.clearType = function() {
-  return jspb.Message.setField(this, 2, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.OpeningMetadata.ApplicationFormQuestion.prototype.hasType = function() {
-  return jspb.Message.getField(this, 2) != null;
-};
-
-
-/**
- * required string short_description = 1;
- * @return {string}
- */
-proto.OpeningMetadata.prototype.getShortDescription = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.setShortDescription = function(value) {
-  return jspb.Message.setField(this, 1, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.clearShortDescription = function() {
-  return jspb.Message.setField(this, 1, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.OpeningMetadata.prototype.hasShortDescription = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-/**
- * required string description = 2;
- * @return {string}
- */
-proto.OpeningMetadata.prototype.getDescription = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.setDescription = function(value) {
-  return jspb.Message.setField(this, 2, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.clearDescription = function() {
-  return jspb.Message.setField(this, 2, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.OpeningMetadata.prototype.hasDescription = function() {
-  return jspb.Message.getField(this, 2) != null;
-};
-
-
-/**
- * optional uint32 hiring_limit = 3;
- * @return {number}
- */
-proto.OpeningMetadata.prototype.getHiringLimit = function() {
-  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
-};
-
-
-/**
- * @param {number} value
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.setHiringLimit = function(value) {
-  return jspb.Message.setField(this, 3, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.clearHiringLimit = function() {
-  return jspb.Message.setField(this, 3, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.OpeningMetadata.prototype.hasHiringLimit = function() {
-  return jspb.Message.getField(this, 3) != null;
-};
-
-
-/**
- * optional uint64 expected_ending_timestamp = 4;
- * @return {number}
- */
-proto.OpeningMetadata.prototype.getExpectedEndingTimestamp = function() {
-  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
-};
-
-
-/**
- * @param {number} value
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.setExpectedEndingTimestamp = function(value) {
-  return jspb.Message.setField(this, 4, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.clearExpectedEndingTimestamp = function() {
-  return jspb.Message.setField(this, 4, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.OpeningMetadata.prototype.hasExpectedEndingTimestamp = function() {
-  return jspb.Message.getField(this, 4) != null;
-};
-
-
-/**
- * required string application_details = 5;
- * @return {string}
- */
-proto.OpeningMetadata.prototype.getApplicationDetails = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.setApplicationDetails = function(value) {
-  return jspb.Message.setField(this, 5, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.clearApplicationDetails = function() {
-  return jspb.Message.setField(this, 5, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.OpeningMetadata.prototype.hasApplicationDetails = function() {
-  return jspb.Message.getField(this, 5) != null;
-};
-
-
-/**
- * repeated ApplicationFormQuestion application_form_questions = 6;
- * @return {!Array<!proto.OpeningMetadata.ApplicationFormQuestion>}
- */
-proto.OpeningMetadata.prototype.getApplicationFormQuestionsList = function() {
-  return /** @type{!Array<!proto.OpeningMetadata.ApplicationFormQuestion>} */ (
-    jspb.Message.getRepeatedWrapperField(this, proto.OpeningMetadata.ApplicationFormQuestion, 6));
-};
-
-
-/**
- * @param {!Array<!proto.OpeningMetadata.ApplicationFormQuestion>} value
- * @return {!proto.OpeningMetadata} returns this
-*/
-proto.OpeningMetadata.prototype.setApplicationFormQuestionsList = function(value) {
-  return jspb.Message.setRepeatedWrapperField(this, 6, value);
-};
-
-
-/**
- * @param {!proto.OpeningMetadata.ApplicationFormQuestion=} opt_value
- * @param {number=} opt_index
- * @return {!proto.OpeningMetadata.ApplicationFormQuestion}
- */
-proto.OpeningMetadata.prototype.addApplicationFormQuestions = function(opt_value, opt_index) {
-  return jspb.Message.addToRepeatedWrapperField(this, 6, opt_value, proto.OpeningMetadata.ApplicationFormQuestion, opt_index);
-};
-
-
-/**
- * Clears the list making it empty but non-null.
- * @return {!proto.OpeningMetadata} returns this
- */
-proto.OpeningMetadata.prototype.clearApplicationFormQuestionsList = function() {
-  return this.setApplicationFormQuestionsList([]);
-};
-
-
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.UpcomingOpeningMetadata.prototype.toObject = function(opt_includeInstance) {
-  return proto.UpcomingOpeningMetadata.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.UpcomingOpeningMetadata} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.UpcomingOpeningMetadata.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    expectedStart: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
-    rewardPerBlock: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
-    minApplicationStake: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f,
-    metadata: (f = msg.getMetadata()) && proto.OpeningMetadata.toObject(includeInstance, f)
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.UpcomingOpeningMetadata}
- */
-proto.UpcomingOpeningMetadata.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.UpcomingOpeningMetadata;
-  return proto.UpcomingOpeningMetadata.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.UpcomingOpeningMetadata} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.UpcomingOpeningMetadata}
- */
-proto.UpcomingOpeningMetadata.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {number} */ (reader.readUint64());
-      msg.setExpectedStart(value);
-      break;
-    case 2:
-      var value = /** @type {number} */ (reader.readUint64());
-      msg.setRewardPerBlock(value);
-      break;
-    case 3:
-      var value = /** @type {number} */ (reader.readUint64());
-      msg.setMinApplicationStake(value);
-      break;
-    case 4:
-      var value = new proto.OpeningMetadata;
-      reader.readMessage(value,proto.OpeningMetadata.deserializeBinaryFromReader);
-      msg.setMetadata(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.UpcomingOpeningMetadata.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.UpcomingOpeningMetadata.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.UpcomingOpeningMetadata} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.UpcomingOpeningMetadata.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = /** @type {number} */ (jspb.Message.getField(message, 1));
-  if (f != null) {
-    writer.writeUint64(
-      1,
-      f
-    );
-  }
-  f = /** @type {number} */ (jspb.Message.getField(message, 2));
-  if (f != null) {
-    writer.writeUint64(
-      2,
-      f
-    );
-  }
-  f = /** @type {number} */ (jspb.Message.getField(message, 3));
-  if (f != null) {
-    writer.writeUint64(
-      3,
-      f
-    );
-  }
-  f = message.getMetadata();
-  if (f != null) {
-    writer.writeMessage(
-      4,
-      f,
-      proto.OpeningMetadata.serializeBinaryToWriter
-    );
-  }
-};
-
-
-/**
- * required uint64 expected_start = 1;
- * @return {number}
- */
-proto.UpcomingOpeningMetadata.prototype.getExpectedStart = function() {
-  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
-};
-
-
-/**
- * @param {number} value
- * @return {!proto.UpcomingOpeningMetadata} returns this
- */
-proto.UpcomingOpeningMetadata.prototype.setExpectedStart = function(value) {
-  return jspb.Message.setField(this, 1, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.UpcomingOpeningMetadata} returns this
- */
-proto.UpcomingOpeningMetadata.prototype.clearExpectedStart = function() {
-  return jspb.Message.setField(this, 1, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.UpcomingOpeningMetadata.prototype.hasExpectedStart = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-/**
- * required uint64 reward_per_block = 2;
- * @return {number}
- */
-proto.UpcomingOpeningMetadata.prototype.getRewardPerBlock = function() {
-  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
-};
-
-
-/**
- * @param {number} value
- * @return {!proto.UpcomingOpeningMetadata} returns this
- */
-proto.UpcomingOpeningMetadata.prototype.setRewardPerBlock = function(value) {
-  return jspb.Message.setField(this, 2, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.UpcomingOpeningMetadata} returns this
- */
-proto.UpcomingOpeningMetadata.prototype.clearRewardPerBlock = function() {
-  return jspb.Message.setField(this, 2, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.UpcomingOpeningMetadata.prototype.hasRewardPerBlock = function() {
-  return jspb.Message.getField(this, 2) != null;
-};
-
-
-/**
- * required uint64 min_application_stake = 3;
- * @return {number}
- */
-proto.UpcomingOpeningMetadata.prototype.getMinApplicationStake = function() {
-  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
-};
-
-
-/**
- * @param {number} value
- * @return {!proto.UpcomingOpeningMetadata} returns this
- */
-proto.UpcomingOpeningMetadata.prototype.setMinApplicationStake = function(value) {
-  return jspb.Message.setField(this, 3, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.UpcomingOpeningMetadata} returns this
- */
-proto.UpcomingOpeningMetadata.prototype.clearMinApplicationStake = function() {
-  return jspb.Message.setField(this, 3, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.UpcomingOpeningMetadata.prototype.hasMinApplicationStake = function() {
-  return jspb.Message.getField(this, 3) != null;
-};
-
-
-/**
- * required OpeningMetadata metadata = 4;
- * @return {!proto.OpeningMetadata}
- */
-proto.UpcomingOpeningMetadata.prototype.getMetadata = function() {
-  return /** @type{!proto.OpeningMetadata} */ (
-    jspb.Message.getWrapperField(this, proto.OpeningMetadata, 4, 1));
-};
-
-
-/**
- * @param {!proto.OpeningMetadata} value
- * @return {!proto.UpcomingOpeningMetadata} returns this
-*/
-proto.UpcomingOpeningMetadata.prototype.setMetadata = function(value) {
-  return jspb.Message.setWrapperField(this, 4, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.UpcomingOpeningMetadata} returns this
- */
-proto.UpcomingOpeningMetadata.prototype.clearMetadata = function() {
-  return jspb.Message.setField(this, 4, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.UpcomingOpeningMetadata.prototype.hasMetadata = function() {
-  return jspb.Message.getField(this, 4) != null;
-};
-
-
-
-/**
- * List of repeated fields within this message type.
- * @private {!Array<number>}
- * @const
- */
-proto.ApplicationMetadata.repeatedFields_ = [1];
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.ApplicationMetadata.prototype.toObject = function(opt_includeInstance) {
-  return proto.ApplicationMetadata.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.ApplicationMetadata} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.ApplicationMetadata.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    answersList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.ApplicationMetadata}
- */
-proto.ApplicationMetadata.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.ApplicationMetadata;
-  return proto.ApplicationMetadata.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.ApplicationMetadata} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.ApplicationMetadata}
- */
-proto.ApplicationMetadata.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {string} */ (reader.readString());
-      msg.addAnswers(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.ApplicationMetadata.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.ApplicationMetadata.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.ApplicationMetadata} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.ApplicationMetadata.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = message.getAnswersList();
-  if (f.length > 0) {
-    writer.writeRepeatedString(
-      1,
-      f
-    );
-  }
-};
-
-
-/**
- * repeated string answers = 1;
- * @return {!Array<string>}
- */
-proto.ApplicationMetadata.prototype.getAnswersList = function() {
-  return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1));
-};
-
-
-/**
- * @param {!Array<string>} value
- * @return {!proto.ApplicationMetadata} returns this
- */
-proto.ApplicationMetadata.prototype.setAnswersList = function(value) {
-  return jspb.Message.setField(this, 1, value || []);
-};
-
-
-/**
- * @param {string} value
- * @param {number=} opt_index
- * @return {!proto.ApplicationMetadata} returns this
- */
-proto.ApplicationMetadata.prototype.addAnswers = function(value, opt_index) {
-  return jspb.Message.addToRepeatedField(this, 1, value, opt_index);
-};
-
-
-/**
- * Clears the list making it empty but non-null.
- * @return {!proto.ApplicationMetadata} returns this
- */
-proto.ApplicationMetadata.prototype.clearAnswersList = function() {
-  return this.setAnswersList([]);
-};
-
-
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.WorkingGroupMetadata.prototype.toObject = function(opt_includeInstance) {
-  return proto.WorkingGroupMetadata.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.WorkingGroupMetadata} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.WorkingGroupMetadata.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    description: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
-    about: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
-    status: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f,
-    statusMessage: (f = jspb.Message.getField(msg, 4)) == null ? undefined : f
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.WorkingGroupMetadata}
- */
-proto.WorkingGroupMetadata.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.WorkingGroupMetadata;
-  return proto.WorkingGroupMetadata.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.WorkingGroupMetadata} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.WorkingGroupMetadata}
- */
-proto.WorkingGroupMetadata.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setDescription(value);
-      break;
-    case 2:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setAbout(value);
-      break;
-    case 3:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setStatus(value);
-      break;
-    case 4:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setStatusMessage(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.WorkingGroupMetadata.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.WorkingGroupMetadata.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.WorkingGroupMetadata} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.WorkingGroupMetadata.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = /** @type {string} */ (jspb.Message.getField(message, 1));
-  if (f != null) {
-    writer.writeString(
-      1,
-      f
-    );
-  }
-  f = /** @type {string} */ (jspb.Message.getField(message, 2));
-  if (f != null) {
-    writer.writeString(
-      2,
-      f
-    );
-  }
-  f = /** @type {string} */ (jspb.Message.getField(message, 3));
-  if (f != null) {
-    writer.writeString(
-      3,
-      f
-    );
-  }
-  f = /** @type {string} */ (jspb.Message.getField(message, 4));
-  if (f != null) {
-    writer.writeString(
-      4,
-      f
-    );
-  }
-};
-
-
-/**
- * optional string description = 1;
- * @return {string}
- */
-proto.WorkingGroupMetadata.prototype.getDescription = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.WorkingGroupMetadata} returns this
- */
-proto.WorkingGroupMetadata.prototype.setDescription = function(value) {
-  return jspb.Message.setField(this, 1, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.WorkingGroupMetadata} returns this
- */
-proto.WorkingGroupMetadata.prototype.clearDescription = function() {
-  return jspb.Message.setField(this, 1, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.WorkingGroupMetadata.prototype.hasDescription = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-/**
- * optional string about = 2;
- * @return {string}
- */
-proto.WorkingGroupMetadata.prototype.getAbout = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.WorkingGroupMetadata} returns this
- */
-proto.WorkingGroupMetadata.prototype.setAbout = function(value) {
-  return jspb.Message.setField(this, 2, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.WorkingGroupMetadata} returns this
- */
-proto.WorkingGroupMetadata.prototype.clearAbout = function() {
-  return jspb.Message.setField(this, 2, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.WorkingGroupMetadata.prototype.hasAbout = function() {
-  return jspb.Message.getField(this, 2) != null;
-};
-
-
-/**
- * optional string status = 3;
- * @return {string}
- */
-proto.WorkingGroupMetadata.prototype.getStatus = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.WorkingGroupMetadata} returns this
- */
-proto.WorkingGroupMetadata.prototype.setStatus = function(value) {
-  return jspb.Message.setField(this, 3, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.WorkingGroupMetadata} returns this
- */
-proto.WorkingGroupMetadata.prototype.clearStatus = function() {
-  return jspb.Message.setField(this, 3, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.WorkingGroupMetadata.prototype.hasStatus = function() {
-  return jspb.Message.getField(this, 3) != null;
-};
-
-
-/**
- * optional string status_message = 4;
- * @return {string}
- */
-proto.WorkingGroupMetadata.prototype.getStatusMessage = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.WorkingGroupMetadata} returns this
- */
-proto.WorkingGroupMetadata.prototype.setStatusMessage = function(value) {
-  return jspb.Message.setField(this, 4, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.WorkingGroupMetadata} returns this
- */
-proto.WorkingGroupMetadata.prototype.clearStatusMessage = function() {
-  return jspb.Message.setField(this, 4, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.WorkingGroupMetadata.prototype.hasStatusMessage = function() {
-  return jspb.Message.getField(this, 4) != null;
-};
-
-
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.SetGroupMetadata.prototype.toObject = function(opt_includeInstance) {
-  return proto.SetGroupMetadata.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.SetGroupMetadata} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.SetGroupMetadata.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    newMetadata: (f = msg.getNewMetadata()) && proto.WorkingGroupMetadata.toObject(includeInstance, f)
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.SetGroupMetadata}
- */
-proto.SetGroupMetadata.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.SetGroupMetadata;
-  return proto.SetGroupMetadata.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.SetGroupMetadata} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.SetGroupMetadata}
- */
-proto.SetGroupMetadata.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = new proto.WorkingGroupMetadata;
-      reader.readMessage(value,proto.WorkingGroupMetadata.deserializeBinaryFromReader);
-      msg.setNewMetadata(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.SetGroupMetadata.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.SetGroupMetadata.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.SetGroupMetadata} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.SetGroupMetadata.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = message.getNewMetadata();
-  if (f != null) {
-    writer.writeMessage(
-      1,
-      f,
-      proto.WorkingGroupMetadata.serializeBinaryToWriter
-    );
-  }
-};
-
-
-/**
- * required WorkingGroupMetadata new_metadata = 1;
- * @return {!proto.WorkingGroupMetadata}
- */
-proto.SetGroupMetadata.prototype.getNewMetadata = function() {
-  return /** @type{!proto.WorkingGroupMetadata} */ (
-    jspb.Message.getWrapperField(this, proto.WorkingGroupMetadata, 1, 1));
-};
-
-
-/**
- * @param {!proto.WorkingGroupMetadata} value
- * @return {!proto.SetGroupMetadata} returns this
-*/
-proto.SetGroupMetadata.prototype.setNewMetadata = function(value) {
-  return jspb.Message.setWrapperField(this, 1, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.SetGroupMetadata} returns this
- */
-proto.SetGroupMetadata.prototype.clearNewMetadata = function() {
-  return jspb.Message.setField(this, 1, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.SetGroupMetadata.prototype.hasNewMetadata = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.AddUpcomingOpening.prototype.toObject = function(opt_includeInstance) {
-  return proto.AddUpcomingOpening.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.AddUpcomingOpening} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.AddUpcomingOpening.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    metadata: (f = msg.getMetadata()) && proto.UpcomingOpeningMetadata.toObject(includeInstance, f)
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.AddUpcomingOpening}
- */
-proto.AddUpcomingOpening.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.AddUpcomingOpening;
-  return proto.AddUpcomingOpening.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.AddUpcomingOpening} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.AddUpcomingOpening}
- */
-proto.AddUpcomingOpening.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = new proto.UpcomingOpeningMetadata;
-      reader.readMessage(value,proto.UpcomingOpeningMetadata.deserializeBinaryFromReader);
-      msg.setMetadata(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.AddUpcomingOpening.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.AddUpcomingOpening.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.AddUpcomingOpening} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.AddUpcomingOpening.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = message.getMetadata();
-  if (f != null) {
-    writer.writeMessage(
-      1,
-      f,
-      proto.UpcomingOpeningMetadata.serializeBinaryToWriter
-    );
-  }
-};
-
-
-/**
- * required UpcomingOpeningMetadata metadata = 1;
- * @return {!proto.UpcomingOpeningMetadata}
- */
-proto.AddUpcomingOpening.prototype.getMetadata = function() {
-  return /** @type{!proto.UpcomingOpeningMetadata} */ (
-    jspb.Message.getWrapperField(this, proto.UpcomingOpeningMetadata, 1, 1));
-};
-
-
-/**
- * @param {!proto.UpcomingOpeningMetadata} value
- * @return {!proto.AddUpcomingOpening} returns this
-*/
-proto.AddUpcomingOpening.prototype.setMetadata = function(value) {
-  return jspb.Message.setWrapperField(this, 1, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.AddUpcomingOpening} returns this
- */
-proto.AddUpcomingOpening.prototype.clearMetadata = function() {
-  return jspb.Message.setField(this, 1, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.AddUpcomingOpening.prototype.hasMetadata = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.RemoveUpcomingOpening.prototype.toObject = function(opt_includeInstance) {
-  return proto.RemoveUpcomingOpening.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.RemoveUpcomingOpening} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.RemoveUpcomingOpening.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    id: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.RemoveUpcomingOpening}
- */
-proto.RemoveUpcomingOpening.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.RemoveUpcomingOpening;
-  return proto.RemoveUpcomingOpening.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.RemoveUpcomingOpening} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.RemoveUpcomingOpening}
- */
-proto.RemoveUpcomingOpening.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = /** @type {string} */ (reader.readString());
-      msg.setId(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.RemoveUpcomingOpening.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.RemoveUpcomingOpening.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.RemoveUpcomingOpening} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.RemoveUpcomingOpening.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = /** @type {string} */ (jspb.Message.getField(message, 1));
-  if (f != null) {
-    writer.writeString(
-      1,
-      f
-    );
-  }
-};
-
-
-/**
- * required string id = 1;
- * @return {string}
- */
-proto.RemoveUpcomingOpening.prototype.getId = function() {
-  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
-};
-
-
-/**
- * @param {string} value
- * @return {!proto.RemoveUpcomingOpening} returns this
- */
-proto.RemoveUpcomingOpening.prototype.setId = function(value) {
-  return jspb.Message.setField(this, 1, value);
-};
-
-
-/**
- * Clears the field making it undefined.
- * @return {!proto.RemoveUpcomingOpening} returns this
- */
-proto.RemoveUpcomingOpening.prototype.clearId = function() {
-  return jspb.Message.setField(this, 1, undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.RemoveUpcomingOpening.prototype.hasId = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-
-/**
- * Oneof group definitions for this message. Each group defines the field
- * numbers belonging to that group. When of these fields' value is set, all
- * other fields in the group are cleared. During deserialization, if multiple
- * fields are encountered for a group, only the last value seen will be kept.
- * @private {!Array<!Array<number>>}
- * @const
- */
-proto.WorkingGroupMetadataAction.oneofGroups_ = [[1,2,3]];
-
-/**
- * @enum {number}
- */
-proto.WorkingGroupMetadataAction.ActionCase = {
-  ACTION_NOT_SET: 0,
-  SET_GROUP_METADATA: 1,
-  ADD_UPCOMING_OPENING: 2,
-  REMOVE_UPCOMING_OPENING: 3
-};
-
-/**
- * @return {proto.WorkingGroupMetadataAction.ActionCase}
- */
-proto.WorkingGroupMetadataAction.prototype.getActionCase = function() {
-  return /** @type {proto.WorkingGroupMetadataAction.ActionCase} */(jspb.Message.computeOneofCase(this, proto.WorkingGroupMetadataAction.oneofGroups_[0]));
-};
-
-
-
-if (jspb.Message.GENERATE_TO_OBJECT) {
-/**
- * Creates an object representation of this proto.
- * Field names that are reserved in JavaScript and will be renamed to pb_name.
- * Optional fields that are not set will be set to undefined.
- * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
- * For the list of reserved names please see:
- *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
- * @param {boolean=} opt_includeInstance Deprecated. whether to include the
- *     JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @return {!Object}
- */
-proto.WorkingGroupMetadataAction.prototype.toObject = function(opt_includeInstance) {
-  return proto.WorkingGroupMetadataAction.toObject(opt_includeInstance, this);
-};
-
-
-/**
- * Static version of the {@see toObject} method.
- * @param {boolean|undefined} includeInstance Deprecated. Whether to include
- *     the JSPB instance for transitional soy proto support:
- *     http://goto/soy-param-migration
- * @param {!proto.WorkingGroupMetadataAction} msg The msg instance to transform.
- * @return {!Object}
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.WorkingGroupMetadataAction.toObject = function(includeInstance, msg) {
-  var f, obj = {
-    setGroupMetadata: (f = msg.getSetGroupMetadata()) && proto.SetGroupMetadata.toObject(includeInstance, f),
-    addUpcomingOpening: (f = msg.getAddUpcomingOpening()) && proto.AddUpcomingOpening.toObject(includeInstance, f),
-    removeUpcomingOpening: (f = msg.getRemoveUpcomingOpening()) && proto.RemoveUpcomingOpening.toObject(includeInstance, f)
-  };
-
-  if (includeInstance) {
-    obj.$jspbMessageInstance = msg;
-  }
-  return obj;
-};
-}
-
-
-/**
- * Deserializes binary data (in protobuf wire format).
- * @param {jspb.ByteSource} bytes The bytes to deserialize.
- * @return {!proto.WorkingGroupMetadataAction}
- */
-proto.WorkingGroupMetadataAction.deserializeBinary = function(bytes) {
-  var reader = new jspb.BinaryReader(bytes);
-  var msg = new proto.WorkingGroupMetadataAction;
-  return proto.WorkingGroupMetadataAction.deserializeBinaryFromReader(msg, reader);
-};
-
-
-/**
- * Deserializes binary data (in protobuf wire format) from the
- * given reader into the given message object.
- * @param {!proto.WorkingGroupMetadataAction} msg The message object to deserialize into.
- * @param {!jspb.BinaryReader} reader The BinaryReader to use.
- * @return {!proto.WorkingGroupMetadataAction}
- */
-proto.WorkingGroupMetadataAction.deserializeBinaryFromReader = function(msg, reader) {
-  while (reader.nextField()) {
-    if (reader.isEndGroup()) {
-      break;
-    }
-    var field = reader.getFieldNumber();
-    switch (field) {
-    case 1:
-      var value = new proto.SetGroupMetadata;
-      reader.readMessage(value,proto.SetGroupMetadata.deserializeBinaryFromReader);
-      msg.setSetGroupMetadata(value);
-      break;
-    case 2:
-      var value = new proto.AddUpcomingOpening;
-      reader.readMessage(value,proto.AddUpcomingOpening.deserializeBinaryFromReader);
-      msg.setAddUpcomingOpening(value);
-      break;
-    case 3:
-      var value = new proto.RemoveUpcomingOpening;
-      reader.readMessage(value,proto.RemoveUpcomingOpening.deserializeBinaryFromReader);
-      msg.setRemoveUpcomingOpening(value);
-      break;
-    default:
-      reader.skipField();
-      break;
-    }
-  }
-  return msg;
-};
-
-
-/**
- * Serializes the message to binary data (in protobuf wire format).
- * @return {!Uint8Array}
- */
-proto.WorkingGroupMetadataAction.prototype.serializeBinary = function() {
-  var writer = new jspb.BinaryWriter();
-  proto.WorkingGroupMetadataAction.serializeBinaryToWriter(this, writer);
-  return writer.getResultBuffer();
-};
-
-
-/**
- * Serializes the given message to binary data (in protobuf wire
- * format), writing to the given BinaryWriter.
- * @param {!proto.WorkingGroupMetadataAction} message
- * @param {!jspb.BinaryWriter} writer
- * @suppress {unusedLocalVariables} f is only used for nested messages
- */
-proto.WorkingGroupMetadataAction.serializeBinaryToWriter = function(message, writer) {
-  var f = undefined;
-  f = message.getSetGroupMetadata();
-  if (f != null) {
-    writer.writeMessage(
-      1,
-      f,
-      proto.SetGroupMetadata.serializeBinaryToWriter
-    );
-  }
-  f = message.getAddUpcomingOpening();
-  if (f != null) {
-    writer.writeMessage(
-      2,
-      f,
-      proto.AddUpcomingOpening.serializeBinaryToWriter
-    );
-  }
-  f = message.getRemoveUpcomingOpening();
-  if (f != null) {
-    writer.writeMessage(
-      3,
-      f,
-      proto.RemoveUpcomingOpening.serializeBinaryToWriter
-    );
-  }
-};
-
-
-/**
- * optional SetGroupMetadata set_group_metadata = 1;
- * @return {?proto.SetGroupMetadata}
- */
-proto.WorkingGroupMetadataAction.prototype.getSetGroupMetadata = function() {
-  return /** @type{?proto.SetGroupMetadata} */ (
-    jspb.Message.getWrapperField(this, proto.SetGroupMetadata, 1));
-};
-
-
-/**
- * @param {?proto.SetGroupMetadata|undefined} value
- * @return {!proto.WorkingGroupMetadataAction} returns this
-*/
-proto.WorkingGroupMetadataAction.prototype.setSetGroupMetadata = function(value) {
-  return jspb.Message.setOneofWrapperField(this, 1, proto.WorkingGroupMetadataAction.oneofGroups_[0], value);
-};
-
-
-/**
- * Clears the message field making it undefined.
- * @return {!proto.WorkingGroupMetadataAction} returns this
- */
-proto.WorkingGroupMetadataAction.prototype.clearSetGroupMetadata = function() {
-  return this.setSetGroupMetadata(undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.WorkingGroupMetadataAction.prototype.hasSetGroupMetadata = function() {
-  return jspb.Message.getField(this, 1) != null;
-};
-
-
-/**
- * optional AddUpcomingOpening add_upcoming_opening = 2;
- * @return {?proto.AddUpcomingOpening}
- */
-proto.WorkingGroupMetadataAction.prototype.getAddUpcomingOpening = function() {
-  return /** @type{?proto.AddUpcomingOpening} */ (
-    jspb.Message.getWrapperField(this, proto.AddUpcomingOpening, 2));
-};
-
-
-/**
- * @param {?proto.AddUpcomingOpening|undefined} value
- * @return {!proto.WorkingGroupMetadataAction} returns this
-*/
-proto.WorkingGroupMetadataAction.prototype.setAddUpcomingOpening = function(value) {
-  return jspb.Message.setOneofWrapperField(this, 2, proto.WorkingGroupMetadataAction.oneofGroups_[0], value);
-};
-
-
-/**
- * Clears the message field making it undefined.
- * @return {!proto.WorkingGroupMetadataAction} returns this
- */
-proto.WorkingGroupMetadataAction.prototype.clearAddUpcomingOpening = function() {
-  return this.setAddUpcomingOpening(undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.WorkingGroupMetadataAction.prototype.hasAddUpcomingOpening = function() {
-  return jspb.Message.getField(this, 2) != null;
-};
-
-
-/**
- * optional RemoveUpcomingOpening remove_upcoming_opening = 3;
- * @return {?proto.RemoveUpcomingOpening}
- */
-proto.WorkingGroupMetadataAction.prototype.getRemoveUpcomingOpening = function() {
-  return /** @type{?proto.RemoveUpcomingOpening} */ (
-    jspb.Message.getWrapperField(this, proto.RemoveUpcomingOpening, 3));
-};
-
-
-/**
- * @param {?proto.RemoveUpcomingOpening|undefined} value
- * @return {!proto.WorkingGroupMetadataAction} returns this
-*/
-proto.WorkingGroupMetadataAction.prototype.setRemoveUpcomingOpening = function(value) {
-  return jspb.Message.setOneofWrapperField(this, 3, proto.WorkingGroupMetadataAction.oneofGroups_[0], value);
-};
-
-
-/**
- * Clears the message field making it undefined.
- * @return {!proto.WorkingGroupMetadataAction} returns this
- */
-proto.WorkingGroupMetadataAction.prototype.clearRemoveUpcomingOpening = function() {
-  return this.setRemoveUpcomingOpening(undefined);
-};
-
-
-/**
- * Returns whether this field is set.
- * @return {boolean}
- */
-proto.WorkingGroupMetadataAction.prototype.hasRemoveUpcomingOpening = function() {
-  return jspb.Message.getField(this, 3) != null;
-};
-
-
-goog.object.extend(exports, proto);

+ 5 - 3
metadata-protobuf/package.json

@@ -25,7 +25,9 @@
     "README.md"
   ],
   "dependencies": {
-    "google-protobuf": "^3.14.0"
+    "google-protobuf": "^3.14.0",
+    "long": "^4.0.0",
+    "@types/long": "^4.0.1"
   },
   "devDependencies": {
     "@types/chai": "^4.2.11",
@@ -35,7 +37,7 @@
     "mocha": "^8.2.1",
     "prettier": "2.0.2",
     "ts-node": "^8.8.1",
-    "ts-protoc-gen": "^0.14.0",
-    "typescript": "^4.1.3"
+    "typescript": "^4.1.3",
+    "protobufjs": "^6.10.2"
   }
 }

+ 2 - 2
metadata-protobuf/proto/WorkingGroups.proto

@@ -4,7 +4,7 @@ message OpeningMetadata {
   required string short_description = 1; // Short description of the opening
   required string description = 2; // Full description of the opening
   optional uint32 hiring_limit = 3; // Expected number of hired applicants
-  optional uint64 expected_ending_timestamp = 4; // Expected time when the opening will close (Unix timestamp)
+  optional uint32 expected_ending_timestamp = 4; // Expected time when the opening will close (Unix timestamp)
   required string application_details = 5; // Md-formatted text explaining the application process
   message ApplicationFormQuestion {
     required string question = 1; // The question itself (ie. "What is your name?"")
@@ -18,7 +18,7 @@ message OpeningMetadata {
 }
 
 message UpcomingOpeningMetadata {
-  required uint64 expected_start = 1; // Expected opening start (timestamp)
+  required uint32 expected_start = 1; // Expected opening start (timestamp)
   required uint64 reward_per_block = 2; // Expected reward per block
   required uint64 min_application_stake = 3; // Expected min. application stake
   required OpeningMetadata metadata = 4; // Opening metadata

+ 1 - 3
metadata-protobuf/src/index.ts

@@ -1,4 +1,2 @@
 // protobuf message constructors
-export * from '../compiled/proto/Council_pb'
-export * from '../compiled/proto/Membership_pb'
-export * from '../compiled/proto/WorkingGroups_pb'
+export * from '../compiled'

+ 11 - 4
query-node/mappings/common.ts

@@ -25,14 +25,21 @@ export async function createEvent(
   return event
 }
 
-type MetadataClass<T> = {
-  deserializeBinary: (bytes: Uint8Array) => T
+type AnyMessage<T> = T & {
+  toJSON(): Record<string, unknown>
+}
+
+type AnyMetadataClass<T> = {
   name: string
+  decode(binary: Uint8Array): AnyMessage<T>
+  encode(obj: T): { finish(): Uint8Array }
+  toObject(obj: AnyMessage<T>): Record<string, unknown>
 }
 
-export function deserializeMetadata<T>(metadataType: MetadataClass<T>, metadataBytes: Bytes): T | null {
+export function deserializeMetadata<T>(metadataType: AnyMetadataClass<T>, metadataBytes: Bytes): T | null {
   try {
-    return metadataType.deserializeBinary(metadataBytes.toU8a(true))
+    // We use `toObject()` to get rid of .prototype defaults for optional fields
+    return metadataType.toObject(metadataType.decode(metadataBytes.toU8a(true))) as T
   } catch (e) {
     console.error(`Cannot deserialize ${metadataType.name}! Provided bytes: (${metadataBytes.toHex()})`)
     return null

+ 11 - 19
query-node/mappings/membership.ts

@@ -5,10 +5,9 @@ import { SubstrateEvent } from '@dzlzv/hydra-common'
 import { DatabaseManager } from '@dzlzv/hydra-db-utils'
 import { Members } from './generated/types'
 import BN from 'bn.js'
-import { Bytes } from '@polkadot/types'
 import { MemberId, BuyMembershipParameters, InviteMembershipParameters } from '@joystream/types/augment/all'
 import { MembershipMetadata } from '@joystream/metadata-protobuf'
-import { bytesToString, createEvent, getOrCreateBlock } from './common'
+import { bytesToString, createEvent, deserializeMetadata, getOrCreateBlock } from './common'
 import {
   Membership,
   EventType,
@@ -65,15 +64,6 @@ async function getOrCreateMembershipSnapshot(db: DatabaseManager, event_: Substr
       })
 }
 
-function deserializeMemberMeta(metadataBytes: Bytes): MembershipMetadata | null {
-  try {
-    return MembershipMetadata.deserializeBinary(metadataBytes.toU8a(true))
-  } catch (e) {
-    console.error(`Invalid membership metadata! (${metadataBytes.toHex()})`)
-    return null
-  }
-}
-
 async function newMembershipFromParams(
   db: DatabaseManager,
   event_: SubstrateEvent,
@@ -83,14 +73,14 @@ async function newMembershipFromParams(
 ): Promise<Membership> {
   const { defaultInviteCount } = await getLatestMembershipSystemSnapshot(db)
   const { root_account: rootAccount, controller_account: controllerAccount, handle, metadata: metatadaBytes } = params
-  const metadata = deserializeMemberMeta(metatadaBytes)
+  const metadata = deserializeMetadata(MembershipMetadata, metatadaBytes)
   const eventTime = new Date(event_.blockTimestamp.toNumber())
 
   const metadataEntity = new MemberMetadata({
     createdAt: eventTime,
     updatedAt: eventTime,
-    name: metadata?.getName(),
-    about: metadata?.getAbout(),
+    name: typeof metadata?.name === 'string' ? metadata.name : undefined,
+    about: typeof metadata?.about === 'string' ? metadata.about : undefined,
     // TODO: avatar
   })
 
@@ -162,16 +152,18 @@ export async function members_MemberProfileUpdated(db: DatabaseManager, event_:
   event_.blockTimestamp = new BN(event_.blockTimestamp) // FIXME: Temporary fix for wrong blockTimestamp type
   const { memberId } = new Members.MemberProfileUpdatedEvent(event_).data
   const { metadata: metadataBytesOpt, handle } = new Members.UpdateProfileCall(event_).args
-  const metadata = metadataBytesOpt.isSome ? deserializeMemberMeta(metadataBytesOpt.unwrap()) : undefined
+  const metadata = metadataBytesOpt.isSome
+    ? deserializeMetadata(MembershipMetadata, metadataBytesOpt.unwrap())
+    : undefined
   const member = await getMemberById(db, memberId)
   const eventTime = new Date(event_.blockTimestamp.toNumber())
 
-  if (metadata?.hasName()) {
-    member.metadata.name = metadata.getName()
+  if (typeof metadata?.name === 'string') {
+    member.metadata.name = metadata.name
     member.metadata.updatedAt = eventTime
   }
-  if (metadata?.hasAbout()) {
-    member.metadata.about = metadata.getAbout()
+  if (typeof metadata?.about === 'string') {
+    member.metadata.about = metadata.about
     member.metadata.updatedAt = eventTime
   }
   // TODO: avatar

+ 54 - 57
query-node/mappings/workingGroups.ts

@@ -5,11 +5,13 @@ import { SubstrateEvent } from '@dzlzv/hydra-common'
 import { DatabaseManager } from '@dzlzv/hydra-db-utils'
 import { StorageWorkingGroup as WorkingGroups } from './generated/types'
 import {
-  AddUpcomingOpening,
   ApplicationMetadata,
+  IAddUpcomingOpening,
+  IOpeningMetadata,
+  IRemoveUpcomingOpening,
+  ISetGroupMetadata,
+  IWorkingGroupMetadataAction,
   OpeningMetadata,
-  RemoveUpcomingOpening,
-  SetGroupMetadata,
   WorkingGroupMetadataAction,
 } from '@joystream/metadata-protobuf'
 import { Bytes } from '@polkadot/types'
@@ -72,10 +74,6 @@ import {
 import { createType } from '@joystream/types'
 import _ from 'lodash'
 
-// Shortcuts
-type InputTypeMap = OpeningMetadata.ApplicationFormQuestion.InputTypeMap
-const InputType = OpeningMetadata.ApplicationFormQuestion.InputType
-
 // Reusable functions
 async function getWorkingGroup(
   db: DatabaseManager,
@@ -137,8 +135,8 @@ async function getApplicationFormQuestions(
   return openingWithQuestions.metadata.applicationFormQuestions
 }
 
-function parseQuestionInputType(type: InputTypeMap[keyof InputTypeMap]) {
-  if (type === InputType.TEXTAREA) {
+function parseQuestionInputType(type: OpeningMetadata.ApplicationFormQuestion.InputType) {
+  if (type === OpeningMetadata.ApplicationFormQuestion.InputType.TEXTAREA) {
     return ApplicationFormQuestionType.TEXTAREA
   }
 
@@ -146,20 +144,21 @@ function parseQuestionInputType(type: InputTypeMap[keyof InputTypeMap]) {
 }
 
 function getDefaultOpeningMetadata(group: WorkingGroup, openingType: WorkingGroupOpeningType): OpeningMetadata {
-  const metadata = new OpeningMetadata()
-  metadata.setShortDescription(
-    `${_.startCase(group.name)} ${openingType === WorkingGroupOpeningType.REGULAR ? 'worker' : 'leader'} opening`
-  )
-  metadata.setDescription(
-    `Apply to this opening in order to be considered for ${_.startCase(group.name)} ${
+  const metadata = new OpeningMetadata({
+    shortDescription: `${_.startCase(group.name)} ${
       openingType === WorkingGroupOpeningType.REGULAR ? 'worker' : 'leader'
-    } role!`
-  )
-  metadata.setApplicationDetails(`- Fill the application form`)
-  const applicationFormQuestion = new OpeningMetadata.ApplicationFormQuestion()
-  applicationFormQuestion.setQuestion('What makes you a good candidate?')
-  applicationFormQuestion.setType(OpeningMetadata.ApplicationFormQuestion.InputType.TEXTAREA)
-  metadata.addApplicationFormQuestions(applicationFormQuestion)
+    } opening`,
+    description: `Apply to this opening in order to be considered for ${_.startCase(group.name)} ${
+      openingType === WorkingGroupOpeningType.REGULAR ? 'worker' : 'leader'
+    } role!`,
+    applicationDetails: `- Fill the application form`,
+    applicationFormQuestions: [
+      {
+        question: 'What makes you a good candidate?',
+        type: OpeningMetadata.ApplicationFormQuestion.InputType.TEXTAREA,
+      },
+    ],
+  })
 
   return metadata
 }
@@ -169,10 +168,10 @@ async function createOpeningMeta(
   event_: SubstrateEvent,
   group: WorkingGroup,
   openingType: WorkingGroupOpeningType,
-  originalMeta: Bytes | OpeningMetadata
+  originalMeta: Bytes | IOpeningMetadata
 ): Promise<WorkingGroupOpeningMetadata> {
   let originallyValid: boolean
-  let metadata: OpeningMetadata
+  let metadata: IOpeningMetadata
   if (originalMeta instanceof Bytes) {
     const deserializedMetadata = await deserializeMetadata(OpeningMetadata, originalMeta)
     metadata = deserializedMetadata || (await getDefaultOpeningMetadata(group, openingType))
@@ -184,13 +183,13 @@ async function createOpeningMeta(
   const eventTime = new Date(event_.blockTimestamp.toNumber())
 
   const {
-    applicationFormQuestionsList,
+    applicationFormQuestions,
     applicationDetails,
     description,
     expectedEndingTimestamp,
     hiringLimit,
     shortDescription,
-  } = metadata.toObject()
+  } = metadata
 
   const openingMetadata = new WorkingGroupOpeningMetadata({
     createdAt: eventTime,
@@ -199,20 +198,20 @@ async function createOpeningMeta(
     applicationDetails,
     description,
     shortDescription,
-    hiringLimit,
-    expectedEnding: new Date(expectedEndingTimestamp!),
+    hiringLimit: typeof hiringLimit === 'number' ? hiringLimit : undefined,
+    expectedEnding: expectedEndingTimestamp ? new Date(expectedEndingTimestamp) : undefined,
     applicationFormQuestions: [],
   })
 
   await db.save<WorkingGroupOpeningMetadata>(openingMetadata)
 
   await Promise.all(
-    applicationFormQuestionsList.map(async ({ question, type }, index) => {
+    (applicationFormQuestions || []).map(async ({ question, type }, index) => {
       const applicationFormQuestion = new ApplicationFormQuestion({
         createdAt: eventTime,
         updatedAt: eventTime,
         question,
-        type: parseQuestionInputType(type!),
+        type: parseQuestionInputType(type),
         index,
         openingMetadata,
       })
@@ -234,9 +233,9 @@ async function createApplicationQuestionAnswers(
     return
   }
   const questions = await getApplicationFormQuestions(db, application.opening.id)
-  const { answersList } = metadata.toObject()
+  const { answers } = metadata
   await Promise.all(
-    answersList.slice(0, questions.length).map(async (answer, index) => {
+    (answers || []).slice(0, questions.length).map(async (answer, index) => {
       const applicationFormQuestionAnswer = new ApplicationFormQuestionAnswer({
         createdAt: application.createdAt,
         updatedAt: application.updatedAt,
@@ -255,9 +254,9 @@ async function handleAddUpcomingOpeningAction(
   db: DatabaseManager,
   event_: SubstrateEvent,
   statusChangedEvent: StatusTextChangedEvent,
-  action: AddUpcomingOpening
-): Promise<UpcomingOpeningAdded> {
-  const upcomingOpeningMeta = action.getMetadata().toObject()
+  action: IAddUpcomingOpening
+): Promise<UpcomingOpeningAdded | InvalidActionMetadata> {
+  const upcomingOpeningMeta = action.metadata
   const group = await getWorkingGroup(db, event_)
   const eventTime = new Date(event_.blockTimestamp.toNumber())
   const openingMeta = await createOpeningMeta(
@@ -265,16 +264,16 @@ async function handleAddUpcomingOpeningAction(
     event_,
     group,
     WorkingGroupOpeningType.REGULAR,
-    action.getMetadata().getMetadata()
+    action.metadata.metadata
   )
   const upcomingOpening = new UpcomingWorkingGroupOpening({
     createdAt: eventTime,
     updatedAt: eventTime,
     metadata: openingMeta,
     group,
-    rewardPerBlock: new BN(upcomingOpeningMeta.rewardPerBlock!),
-    expectedStart: new Date(upcomingOpeningMeta.expectedStart!),
-    stakeAmount: new BN(upcomingOpeningMeta.minApplicationStake!),
+    rewardPerBlock: new BN(upcomingOpeningMeta.rewardPerBlock.toString()),
+    expectedStart: new Date(upcomingOpeningMeta.expectedStart),
+    stakeAmount: new BN(upcomingOpeningMeta.minApplicationStake.toString()),
     createdInEvent: statusChangedEvent,
     createdAtBlock: await getOrCreateBlock(db, event_),
   })
@@ -288,9 +287,9 @@ async function handleAddUpcomingOpeningAction(
 
 async function handleRemoveUpcomingOpeningAction(
   db: DatabaseManager,
-  action: RemoveUpcomingOpening
+  action: IRemoveUpcomingOpening
 ): Promise<UpcomingOpeningRemoved | InvalidActionMetadata> {
-  const id = action.getId()
+  const { id } = action
   const upcomingOpening = await db.get(UpcomingWorkingGroupOpening, { where: { id } })
   let result: UpcomingOpeningRemoved | InvalidActionMetadata
   if (upcomingOpening) {
@@ -310,9 +309,9 @@ async function handleSetWorkingGroupMetadataAction(
   db: DatabaseManager,
   event_: SubstrateEvent,
   statusChangedEvent: StatusTextChangedEvent,
-  action: SetGroupMetadata
+  action: ISetGroupMetadata
 ): Promise<WorkingGroupMetadataSet> {
-  const { newMetadata } = action.toObject()
+  const { newMetadata } = action
   const group = await getWorkingGroup(db, event_, ['metadata'])
   const groupMetadata = group.metadata
   const eventTime = new Date(event_.blockTimestamp.toNumber())
@@ -342,22 +341,19 @@ async function handleWorkingGroupMetadataAction(
   db: DatabaseManager,
   event_: SubstrateEvent,
   statusChangedEvent: StatusTextChangedEvent,
-  action: WorkingGroupMetadataAction
+  action: IWorkingGroupMetadataAction
 ): Promise<typeof WorkingGroupMetadataActionResult> {
-  switch (action.getActionCase()) {
-    case WorkingGroupMetadataAction.ActionCase.ADD_UPCOMING_OPENING: {
-      return handleAddUpcomingOpeningAction(db, event_, statusChangedEvent, action.getAddUpcomingOpening()!)
-    }
-    case WorkingGroupMetadataAction.ActionCase.REMOVE_UPCOMING_OPENING: {
-      return handleRemoveUpcomingOpeningAction(db, action.getRemoveUpcomingOpening()!)
-    }
-    case WorkingGroupMetadataAction.ActionCase.SET_GROUP_METADATA: {
-      return handleSetWorkingGroupMetadataAction(db, event_, statusChangedEvent, action.getSetGroupMetadata()!)
-    }
+  if (action.addUpcomingOpening) {
+    return handleAddUpcomingOpeningAction(db, event_, statusChangedEvent, action.addUpcomingOpening)
+  } else if (action.removeUpcomingOpening) {
+    return handleRemoveUpcomingOpeningAction(db, action.removeUpcomingOpening)
+  } else if (action.setGroupMetadata) {
+    return handleSetWorkingGroupMetadataAction(db, event_, statusChangedEvent, action.setGroupMetadata)
+  } else {
+    const result = new InvalidActionMetadata()
+    result.reason = 'Unexpected action type'
+    return result
   }
-  const result = new InvalidActionMetadata()
-  result.reason = 'Unexpected action type'
-  return result
 }
 
 async function handleTerminatedWorker(db: DatabaseManager, event_: SubstrateEvent): Promise<void> {
@@ -895,6 +891,7 @@ export async function workingGroups_LeaderUnset(db: DatabaseManager, event_: Sub
     updatedAt: eventTime,
     group,
     event: await createEvent(db, event_, EventType.LeaderUnset),
+    leader: group.leader,
   })
 
   await db.save<LeaderUnsetEvent>(leaderUnsetEvent)

+ 3 - 0
query-node/schemas/workingGroupsEvents.graphql

@@ -72,6 +72,9 @@ type LeaderUnsetEvent @entity {
 
   "Related group"
   group: WorkingGroup!
+
+  "A leader that was unset"
+  leader: Worker!
 }
 
 type WorkerExitedEvent @entity {

+ 6 - 5
tests/integration-tests/src/Api.ts

@@ -33,6 +33,8 @@ import {
   ApplyOnOpeningParameters,
   Worker,
 } from '@joystream/types/working-group'
+import { DeriveAllSections } from '@polkadot/api/util/decorate'
+import { ExactDerive } from '@polkadot/api-derive'
 
 export enum WorkingGroups {
   StorageWorkingGroup = 'storageWorkingGroup',
@@ -119,7 +121,7 @@ export class Api {
     return this.api.consts
   }
 
-  public get derive() {
+  public get derive(): DeriveAllSections<'promise', ExactDerive> {
     return this.api.derive
   }
 
@@ -130,12 +132,11 @@ export class Api {
     return this.sender.signAndSend(tx, sender)
   }
 
-  public async sendExtrinsicsAndGetEvents<EventDetailsType extends EventDetails>(
+  public async sendExtrinsicsAndGetResults(
     txs: SubmittableExtrinsic<'promise'>[],
     sender: AccountId | string | AccountId[] | string[],
-    getEvent: (result: ISubmittableResult) => Promise<EventDetailsType>,
     preserveOrder = false
-  ): Promise<EventDetailsType[]> {
+  ): Promise<ISubmittableResult[]> {
     let results: ISubmittableResult[] = []
     if (preserveOrder) {
       for (const i in txs) {
@@ -148,7 +149,7 @@ export class Api {
         txs.map((tx, i) => this.sender.signAndSend(tx, Array.isArray(sender) ? sender[i] : sender))
       )
     }
-    return Promise.all(results.map((result) => getEvent(result)))
+    return results
   }
 
   public async makeSudoCall(tx: SubmittableExtrinsic<'promise'>): Promise<ISubmittableResult> {

+ 3 - 2
tests/integration-tests/src/Fixture.ts

@@ -121,6 +121,7 @@ export abstract class BaseQueryNodeFixture extends BaseFixture {
 
 export abstract class StandardizedFixture extends BaseQueryNodeFixture {
   protected extrinsics: SubmittableExtrinsic<'promise'>[] = []
+  protected results: ISubmittableResult[] = []
   protected events: EventDetails[] = []
   protected areExtrinsicsOrderSensitive = false
 
@@ -142,12 +143,12 @@ export abstract class StandardizedFixture extends BaseQueryNodeFixture {
     const accountOrAccounts = await this.getSignerAccountOrAccounts()
     this.extrinsics = await this.getExtrinsics()
     await this.api.prepareAccountsForFeeExpenses(accountOrAccounts, this.extrinsics)
-    this.events = await this.api.sendExtrinsicsAndGetEvents(
+    this.results = await this.api.sendExtrinsicsAndGetResults(
       this.extrinsics,
       accountOrAccounts,
-      (r) => this.getEventFromResult(r),
       this.areExtrinsicsOrderSensitive
     )
+    this.events = await Promise.all(this.results.map((r) => this.getEventFromResult(r)))
   }
 }
 

+ 13 - 0
tests/integration-tests/src/QueryNodeApi.ts

@@ -164,6 +164,10 @@ import {
   GetBudgetSpendingEventsByEventIdsQuery,
   GetBudgetSpendingEventsByEventIdsQueryVariables,
   GetBudgetSpendingEventsByEventIds,
+  LeaderUnsetEventFieldsFragment,
+  GetLeaderUnsetEventsByEventIdsQuery,
+  GetLeaderUnsetEventsByEventIdsQueryVariables,
+  GetLeaderUnsetEventsByEventIds,
 } from './graphql/generated/queries'
 import { Maybe } from './graphql/generated/schema'
 import { OperationDefinitionNode } from 'graphql'
@@ -637,4 +641,13 @@ export class QueryNodeApi {
       GetBudgetSpendingEventsByEventIdsQueryVariables
     >(GetBudgetSpendingEventsByEventIds, { eventIds }, 'budgetSpendingEvents')
   }
+
+  public async getLeaderUnsetEvent(event: EventDetails): Promise<LeaderUnsetEventFieldsFragment | null> {
+    const eventId = this.getQueryNodeEventId(event.blockNumber, event.indexInBlock)
+    return this.firstEntityQuery<GetLeaderUnsetEventsByEventIdsQuery, GetLeaderUnsetEventsByEventIdsQueryVariables>(
+      GetLeaderUnsetEventsByEventIds,
+      { eventIds: [eventId] },
+      'leaderUnsetEvents'
+    )
+  }
 }

+ 8 - 5
tests/integration-tests/src/fixtures/membership/BaseMembershipFixture.ts

@@ -1,21 +1,24 @@
 import { BaseQueryNodeFixture } from '../../Fixture'
 import { MembershipMetadata } from '@joystream/metadata-protobuf'
-import { CreateInterface, createType } from '@joystream/types'
+import { CreateInterface } from '@joystream/types'
 import { BuyMembershipParameters } from '@joystream/types/members'
+import { Utils } from '../../utils'
 
 // Common code for Membership fixtures
 // TODO: Refactor to use StandardizedFixture?
 export abstract class BaseMembershipFixture extends BaseQueryNodeFixture {
   generateParamsFromAccountId(accountId: string): CreateInterface<BuyMembershipParameters> {
-    const metadata = new MembershipMetadata()
-    metadata.setName(`name${accountId.substring(0, 14)}`)
-    metadata.setAbout(`about${accountId.substring(0, 14)}`)
+    const metadataBytes = Utils.metadataToBytes(MembershipMetadata, {
+      name: `name${accountId.substring(0, 14)}`,
+      about: `about${accountId.substring(0, 14)}`,
+    })
+
     // TODO: avatar
     return {
       root_account: accountId,
       controller_account: accountId,
       handle: `handle${accountId.substring(0, 14)}`,
-      metadata: createType('Bytes', '0x' + Buffer.from(metadata.serializeBinary()).toString('hex')),
+      metadata: metadataBytes,
     }
   }
 }

+ 7 - 6
tests/integration-tests/src/fixtures/membership/BuyMembershipHappyCaseFixture.ts

@@ -11,6 +11,7 @@ import { SubmittableExtrinsic } from '@polkadot/api/types'
 import { MembershipMetadata } from '@joystream/metadata-protobuf'
 import { MembershipBoughtEventDetails } from '../../types'
 import { MembershipBoughtEventFieldsFragment, MembershipFieldsFragment } from '../../graphql/generated/queries'
+import { Utils } from '../../utils'
 
 export class BuyMembershipHappyCaseFixture extends BaseMembershipFixture {
   private accounts: string[]
@@ -46,13 +47,13 @@ export class BuyMembershipHappyCaseFixture extends BaseMembershipFixture {
       entry,
     } = qMember
     const txParams = this.generateParamsFromAccountId(rootAccount)
-    const metadata = MembershipMetadata.deserializeBinary(txParams.metadata.toU8a(true))
+    const metadata = Utils.metadataFromBytes(MembershipMetadata, txParams.metadata)
     assert.equal(blake2AsHex(handle), member.handle_hash.toString())
     assert.equal(handle, txParams.handle)
     assert.equal(rootAccount, member.root_account.toString())
     assert.equal(controllerAccount, member.controller_account.toString())
-    assert.equal(name, metadata.getName())
-    assert.equal(about, metadata.getAbout())
+    assert.equal(name, metadata.name)
+    assert.equal(about, metadata.about)
     // TODO: avatar
     assert.equal(isVerified, false)
     assert.equal(entry, MembershipEntryMethod.Paid)
@@ -68,7 +69,7 @@ export class BuyMembershipHappyCaseFixture extends BaseMembershipFixture {
       throw new Error('Query node: MembershipBought event not found!')
     }
     const txParams = this.generateParamsFromAccountId(account)
-    const metadata = MembershipMetadata.deserializeBinary(txParams.metadata.toU8a(true))
+    const metadata = Utils.metadataFromBytes(MembershipMetadata, txParams.metadata)
     assert.equal(qEvent.event.inBlock.number, eventDetails.blockNumber)
     assert.equal(qEvent.event.inExtrinsic, txHash)
     assert.equal(qEvent.event.indexInBlock, eventDetails.indexInBlock)
@@ -77,8 +78,8 @@ export class BuyMembershipHappyCaseFixture extends BaseMembershipFixture {
     assert.equal(qEvent.handle, txParams.handle)
     assert.equal(qEvent.rootAccount, txParams.root_account.toString())
     assert.equal(qEvent.controllerAccount, txParams.controller_account.toString())
-    assert.equal(qEvent.metadata.name, metadata.getName())
-    assert.equal(qEvent.metadata.about, metadata.getAbout())
+    assert.equal(qEvent.metadata.name, metadata.name)
+    assert.equal(qEvent.metadata.about, metadata.about)
     // TODO: avatar
   }
 

+ 9 - 8
tests/integration-tests/src/fixtures/membership/InviteMembersHappyCaseFixture.ts

@@ -8,6 +8,7 @@ import { MemberInvitedEventFieldsFragment, MembershipFieldsFragment } from '../.
 import { EventType, MembershipEntryMethod } from '../../graphql/generated/schema'
 import { MemberId } from '@joystream/types/common'
 import { MembershipMetadata } from '@joystream/metadata-protobuf'
+import { Utils } from '../../utils'
 
 export class InviteMembersHappyCaseFixture extends BaseMembershipFixture {
   private inviterContext: MemberContext
@@ -44,17 +45,17 @@ export class InviteMembersHappyCaseFixture extends BaseMembershipFixture {
       invitedBy,
     } = qMember
     const txParams = this.generateParamsFromAccountId(account)
-    const metadata = MembershipMetadata.deserializeBinary(txParams.metadata.toU8a(true))
+    const metadata = Utils.metadataFromBytes(MembershipMetadata, txParams.metadata)
     assert.equal(handle, txParams.handle)
     assert.equal(rootAccount, txParams.root_account)
     assert.equal(controllerAccount, txParams.controller_account)
-    assert.equal(name, metadata.getName())
-    assert.equal(about, metadata.getAbout())
+    assert.equal(name, metadata.name)
+    assert.equal(about, metadata.about)
     // TODO: avatar
     assert.equal(isVerified, false)
     assert.equal(entry, MembershipEntryMethod.Invited)
-    assert.isOk(invitedBy)
-    assert.equal(invitedBy!.id, this.inviterContext.memberId.toString())
+    Utils.assert(invitedBy, 'invitedBy cannot be empty')
+    assert.equal(invitedBy.id, this.inviterContext.memberId.toString())
   }
 
   private aseertQueryNodeEventIsValid(
@@ -67,7 +68,7 @@ export class InviteMembersHappyCaseFixture extends BaseMembershipFixture {
       throw new Error('Query node: MemberInvitedEvent not found!')
     }
     const txParams = this.generateParamsFromAccountId(account)
-    const metadata = MembershipMetadata.deserializeBinary(txParams.metadata.toU8a(true))
+    const metadata = Utils.metadataFromBytes(MembershipMetadata, txParams.metadata)
     assert.equal(qEvent.event.inBlock.number, eventDetails.blockNumber)
     assert.equal(qEvent.event.inExtrinsic, txHash)
     assert.equal(qEvent.event.indexInBlock, eventDetails.indexInBlock)
@@ -76,8 +77,8 @@ export class InviteMembersHappyCaseFixture extends BaseMembershipFixture {
     assert.equal(qEvent.handle, txParams.handle)
     assert.equal(qEvent.rootAccount, txParams.root_account)
     assert.equal(qEvent.controllerAccount, txParams.controller_account)
-    assert.equal(qEvent.metadata.name, metadata.getName())
-    assert.equal(qEvent.metadata.about, metadata.getAbout())
+    assert.equal(qEvent.metadata.name, metadata.name)
+    assert.equal(qEvent.metadata.about, metadata.about)
     // TODO: avatar
   }
 

+ 6 - 4
tests/integration-tests/src/fixtures/membership/UpdateProfileHappyCaseFixture.ts

@@ -7,6 +7,7 @@ import { MemberContext, EventDetails } from '../../types'
 import { MembershipFieldsFragment, MemberProfileUpdatedEventFieldsFragment } from '../../graphql/generated/queries'
 import { EventType } from '../../graphql/generated/schema'
 import { MembershipMetadata } from '@joystream/metadata-protobuf'
+import { Utils } from '../../utils'
 
 // TODO: Add partial update to make sure it works too
 export class UpdateProfileHappyCaseFixture extends BaseMembershipFixture {
@@ -60,14 +61,15 @@ export class UpdateProfileHappyCaseFixture extends BaseMembershipFixture {
   }
 
   async execute(): Promise<void> {
-    const metadata = new MembershipMetadata()
-    metadata.setName(this.newName)
-    metadata.setAbout(this.newAbout)
+    const metadata = new MembershipMetadata({
+      name: this.newName,
+      about: this.newAbout,
+    })
     // TODO: avatar
     this.tx = this.api.tx.members.updateProfile(
       this.memberContext.memberId,
       this.newHandle,
-      '0x' + Buffer.from(metadata.serializeBinary()).toString('hex')
+      Utils.metadataToBytes(MembershipMetadata, metadata)
     )
     const txFee = await this.api.estimateTxFee(this.tx, this.memberContext.account)
     await this.api.treasuryTransferBalance(this.memberContext.account, txFee)

+ 10 - 10
tests/integration-tests/src/fixtures/workingGroups/ApplyOnOpeningsHappyCaseFixture.ts

@@ -1,4 +1,4 @@
-import { ApplicationMetadata, OpeningMetadata } from '@joystream/metadata-protobuf'
+import { ApplicationMetadata, IOpeningMetadata } from '@joystream/metadata-protobuf'
 import { assert } from 'chai'
 import { Api } from '../../Api'
 import { ApplicationFieldsFragment, AppliedOnOpeningEventFieldsFragment } from '../../graphql/generated/queries'
@@ -22,13 +22,13 @@ export type ApplicantDetails = {
 
 export type OpeningApplications = {
   openingId: OpeningId
-  openingMetadata: OpeningMetadata.AsObject
+  openingMetadata: IOpeningMetadata
   applicants: ApplicantDetails[]
 }
 
 export type OpeningApplicationsFlattened = {
   openingId: OpeningId
-  openingMetadata: OpeningMetadata.AsObject
+  openingMetadata: IOpeningMetadata
   applicant: ApplicantDetails
 }[]
 
@@ -73,7 +73,7 @@ export class ApplyOnOpeningsHappyCaseFixture extends BaseWorkingGroupFixture {
       const opening = openings[openingIndex]
       return this.api.tx[this.group].applyOnOpening({
         member_id: a.applicant.memberId,
-        description: Utils.metadataToBytes(this.getApplicationMetadata(a.openingMetadata, i)),
+        description: Utils.metadataToBytes(ApplicationMetadata, this.getApplicationMetadata(a.openingMetadata, i)),
         opening_id: a.openingId,
         reward_account_id: a.applicant.rewardAccount,
         role_account_id: a.applicant.roleAccount,
@@ -107,10 +107,10 @@ export class ApplyOnOpeningsHappyCaseFixture extends BaseWorkingGroupFixture {
     return applicationIds
   }
 
-  protected getApplicationMetadata(openingMetadata: OpeningMetadata.AsObject, i: number): ApplicationMetadata {
-    const metadata = new ApplicationMetadata()
-    openingMetadata.applicationFormQuestionsList.forEach((question, j) => {
-      metadata.addAnswers(`Answer to question ${j} by applicant number ${i}`)
+  protected getApplicationMetadata(openingMetadata: IOpeningMetadata, i: number): ApplicationMetadata {
+    const metadata = new ApplicationMetadata({ answers: [] })
+    ;(openingMetadata.applicationFormQuestions || []).forEach((question, j) => {
+      metadata.answers.push(`Answer to question ${j} by applicant number ${i}`)
     })
     return metadata
   }
@@ -133,9 +133,9 @@ export class ApplyOnOpeningsHappyCaseFixture extends BaseWorkingGroupFixture {
       const applicationMetadata = this.getApplicationMetadata(applicationDetails.openingMetadata, i)
       assert.deepEqual(
         qApplication.answers.map(({ question: { question }, answer }) => ({ question, answer })),
-        applicationDetails.openingMetadata.applicationFormQuestionsList.map(({ question }, index) => ({
+        (applicationDetails.openingMetadata.applicationFormQuestions || []).map(({ question }, index) => ({
           question,
-          answer: applicationMetadata.getAnswersList()[index],
+          answer: applicationMetadata.answers[index],
         }))
       )
     })

+ 57 - 30
tests/integration-tests/src/fixtures/workingGroups/BaseCreateOpeningFixture.ts

@@ -1,5 +1,5 @@
 import BN from 'bn.js'
-import { OpeningMetadata } from '@joystream/metadata-protobuf'
+import { IOpeningMetadata, OpeningMetadata } from '@joystream/metadata-protobuf'
 import { assert } from 'chai'
 import { Api } from '../../Api'
 import { MIN_APPLICATION_STAKE, MIN_USTANKING_PERIOD } from '../../consts'
@@ -8,13 +8,18 @@ import { QueryNodeApi } from '../../QueryNodeApi'
 import { WorkingGroupModuleName } from '../../types'
 import { BaseWorkingGroupFixture } from './BaseWorkingGroupFixture'
 import { queryNodeQuestionTypeToMetadataQuestionType } from './utils'
+import { Bytes } from '@polkadot/types'
 import _ from 'lodash'
+import { Utils } from '../../utils'
+import moment from 'moment'
+import { createType } from '@joystream/types'
 
 export type OpeningParams = {
   stake: BN
   unstakingPeriod: number
   reward: BN
-  metadata: OpeningMetadata.AsObject
+  metadata: IOpeningMetadata | string
+  expectMetadataFailue?: boolean
 }
 
 export type UpcomingOpeningParams = OpeningParams & {
@@ -31,57 +36,79 @@ export abstract class BaseCreateOpeningFixture extends BaseWorkingGroupFixture {
     openingsParams?: Partial<OpeningParams>[]
   ) {
     super(api, query, group)
-    this.openingsParams = (openingsParams || [{}]).map((params) => _.merge(this.defaultOpeningParams, params))
+    this.openingsParams = (openingsParams || [{}]).map((params) => ({ ...this.defaultOpeningParams, ...params }))
   }
 
-  protected defaultOpeningParams: OpeningParams = {
+  protected defaultOpeningParams: Omit<OpeningParams, 'metadata'> & { metadata: IOpeningMetadata } = {
     stake: MIN_APPLICATION_STAKE,
     unstakingPeriod: MIN_USTANKING_PERIOD,
     reward: new BN(10),
     metadata: {
       shortDescription: 'Test opening',
       description: '# Test opening',
-      expectedEndingTimestamp: Date.now() + 60,
+      expectedEndingTimestamp: moment().unix() + 60,
       hiringLimit: 1,
       applicationDetails: '- This is automatically created opening, do not apply!',
-      applicationFormQuestionsList: [
+      applicationFormQuestions: [
         { question: 'Question 1?', type: OpeningMetadata.ApplicationFormQuestion.InputType.TEXT },
         { question: 'Question 2?', type: OpeningMetadata.ApplicationFormQuestion.InputType.TEXTAREA },
       ],
     },
   }
 
-  public getDefaultOpeningParams(): OpeningParams {
+  public getDefaultOpeningParams(): Omit<OpeningParams, 'metadata'> & { metadata: IOpeningMetadata } {
     return this.defaultOpeningParams
   }
 
-  protected getMetadata(openingParams: OpeningParams): OpeningMetadata {
-    const metadataObj = openingParams.metadata as Required<OpeningMetadata.AsObject>
-    const metadata = new OpeningMetadata()
-    metadata.setShortDescription(metadataObj.shortDescription)
-    metadata.setDescription(metadataObj.description)
-    metadata.setExpectedEndingTimestamp(metadataObj.expectedEndingTimestamp)
-    metadata.setHiringLimit(metadataObj.hiringLimit)
-    metadata.setApplicationDetails(metadataObj.applicationDetails)
-    metadataObj.applicationFormQuestionsList.forEach(({ question, type }) => {
-      const applicationFormQuestion = new OpeningMetadata.ApplicationFormQuestion()
-      applicationFormQuestion.setQuestion(question!)
-      applicationFormQuestion.setType(type!)
-      metadata.addApplicationFormQuestions(applicationFormQuestion)
-    })
+  protected getMetadata(openingParams: OpeningParams): IOpeningMetadata | null {
+    const metadataObjOrHex = openingParams.metadata
+    if (typeof metadataObjOrHex === 'string') {
+      try {
+        return Utils.metadataFromBytes(OpeningMetadata, createType('Bytes', metadataObjOrHex))
+      } catch (e) {
+        if (!openingParams.expectMetadataFailue) {
+          throw e
+        }
+        return null
+      }
+    }
 
-    return metadata
+    return metadataObjOrHex
+  }
+
+  protected getMetadataBytes(openingParams: OpeningParams): Bytes {
+    const { metadata } = openingParams
+    return typeof metadata === 'string'
+      ? createType('Bytes', metadata)
+      : Utils.metadataToBytes(OpeningMetadata, metadata)
+  }
+
+  protected getDefaultQueryNodeMetadata(isLeadOpening: boolean): IOpeningMetadata {
+    return {
+      shortDescription: `${_.startCase(this.group)} ${!isLeadOpening ? 'worker' : 'leader'} opening`,
+      description: `Apply to this opening in order to be considered for ${_.startCase(this.group)} ${
+        !isLeadOpening ? 'worker' : 'leader'
+      } role!`,
+      applicationDetails: `- Fill the application form`,
+      applicationFormQuestions: [
+        {
+          question: 'What makes you a good candidate?',
+          type: OpeningMetadata.ApplicationFormQuestion.InputType.TEXTAREA,
+        },
+      ],
+    }
   }
 
   protected assertQueriedOpeningMetadataIsValid(
-    openingParams: OpeningParams,
-    qOpeningMeta: OpeningMetadataFieldsFragment
+    qOpeningMeta: OpeningMetadataFieldsFragment,
+    expectedMetadata: IOpeningMetadata | null
   ): void {
-    assert.equal(qOpeningMeta.shortDescription, openingParams.metadata.shortDescription)
-    assert.equal(qOpeningMeta.description, openingParams.metadata.description)
-    assert.equal(new Date(qOpeningMeta.expectedEnding).getTime(), openingParams.metadata.expectedEndingTimestamp)
-    assert.equal(qOpeningMeta.hiringLimit, openingParams.metadata.hiringLimit)
-    assert.equal(qOpeningMeta.applicationDetails, openingParams.metadata.applicationDetails)
+    Utils.assert(expectedMetadata, 'Expected metadata cannot be invalid!')
+    assert.equal(qOpeningMeta.shortDescription, expectedMetadata.shortDescription)
+    assert.equal(qOpeningMeta.description, expectedMetadata.description)
+    assert.equal(new Date(qOpeningMeta.expectedEnding).getTime(), expectedMetadata.expectedEndingTimestamp)
+    assert.equal(qOpeningMeta.hiringLimit, expectedMetadata.hiringLimit)
+    assert.equal(qOpeningMeta.applicationDetails, expectedMetadata.applicationDetails)
     assert.deepEqual(
       qOpeningMeta.applicationFormQuestions
         .sort((a, b) => a.index - b.index)
@@ -89,7 +116,7 @@ export abstract class BaseCreateOpeningFixture extends BaseWorkingGroupFixture {
           question,
           type: queryNodeQuestionTypeToMetadataQuestionType(type),
         })),
-      openingParams.metadata.applicationFormQuestionsList
+      expectedMetadata.applicationFormQuestions
     )
   }
 }

+ 6 - 2
tests/integration-tests/src/fixtures/workingGroups/CreateOpeningsFixture.ts

@@ -39,7 +39,7 @@ export class CreateOpeningsFixture extends BaseCreateOpeningFixture {
   protected async getExtrinsics(): Promise<SubmittableExtrinsic<'promise'>[]> {
     const extrinsics = this.openingsParams.map((params) =>
       this.api.tx[this.group].addOpening(
-        Utils.metadataToBytes(this.getMetadata(params)),
+        this.getMetadataBytes(params),
         this.asSudo ? 'Leader' : 'Regular',
         { stake_amount: params.stake, leaving_unstaking_period: params.unstakingPeriod },
         params.reward
@@ -67,7 +67,11 @@ export class CreateOpeningsFixture extends BaseCreateOpeningFixture {
       assert.equal(qOpening.stakeAmount, openingParams.stake.toString())
       assert.equal(qOpening.unstakingPeriod, openingParams.unstakingPeriod)
       // Metadata
-      this.assertQueriedOpeningMetadataIsValid(openingParams, qOpening.metadata)
+      if (openingParams.expectMetadataFailue) {
+        this.assertQueriedOpeningMetadataIsValid(qOpening.metadata, this.getDefaultQueryNodeMetadata(this.asSudo))
+      } else {
+        this.assertQueriedOpeningMetadataIsValid(qOpening.metadata, this.getMetadata(openingParams))
+      }
     })
   }
 

+ 46 - 34
tests/integration-tests/src/fixtures/workingGroups/CreateUpcomingOpeningsFixture.ts

@@ -8,17 +8,20 @@ import { ISubmittableResult } from '@polkadot/types/types/'
 import { StatusTextChangedEventFieldsFragment, UpcomingOpeningFieldsFragment } from '../../graphql/generated/queries'
 import { EventType } from '../../graphql/generated/schema'
 import { assert } from 'chai'
-import { AddUpcomingOpening, UpcomingOpeningMetadata, WorkingGroupMetadataAction } from '@joystream/metadata-protobuf'
+import { IOpeningMetadata, WorkingGroupMetadataAction } from '@joystream/metadata-protobuf'
 import _ from 'lodash'
+import Long from 'long'
+import { Bytes } from '@polkadot/types'
+import moment from 'moment'
 
 export class CreateUpcomingOpeningsFixture extends BaseCreateOpeningFixture {
   protected openingsParams: UpcomingOpeningParams[]
   protected createdUpcomingOpeningIds: string[] = []
 
-  public getDefaultOpeningParams(): UpcomingOpeningParams {
+  public getDefaultOpeningParams(): Omit<UpcomingOpeningParams, 'metadata'> & { metadata: IOpeningMetadata } {
     return {
       ...super.getDefaultOpeningParams(),
-      expectedStartTs: Date.now() + 3600,
+      expectedStartTs: moment().unix() + 3600,
     }
   }
 
@@ -29,7 +32,7 @@ export class CreateUpcomingOpeningsFixture extends BaseCreateOpeningFixture {
     openingsParams?: Partial<UpcomingOpeningParams>[]
   ) {
     super(api, query, group, openingsParams)
-    this.openingsParams = (openingsParams || [{}]).map((params) => _.merge(this.getDefaultOpeningParams(), params))
+    this.openingsParams = (openingsParams || [{}]).map((params) => ({ ...this.getDefaultOpeningParams(), ...params }))
   }
 
   protected async getSignerAccountOrAccounts(): Promise<string> {
@@ -37,10 +40,9 @@ export class CreateUpcomingOpeningsFixture extends BaseCreateOpeningFixture {
   }
 
   protected async getExtrinsics(): Promise<SubmittableExtrinsic<'promise'>[]> {
-    return this.openingsParams.map((params) => {
-      const metaBytes = Utils.metadataToBytes(this.getActionMetadata(params))
-      return this.api.tx[this.group].setStatusText(metaBytes)
-    })
+    return this.openingsParams.map((params) =>
+      this.api.tx[this.group].setStatusText(this.getActionMetadataBytes(params))
+    )
   }
 
   protected async getEventFromResult(result: ISubmittableResult): Promise<EventDetails> {
@@ -54,21 +56,23 @@ export class CreateUpcomingOpeningsFixture extends BaseCreateOpeningFixture {
     return this.createdUpcomingOpeningIds
   }
 
-  protected getActionMetadata(openingParams: UpcomingOpeningParams): WorkingGroupMetadataAction {
-    const actionMeta = new WorkingGroupMetadataAction()
-    const addUpcomingOpeningMeta = new AddUpcomingOpening()
-
-    const upcomingOpeningMeta = new UpcomingOpeningMetadata()
-    const openingMeta = this.getMetadata(openingParams)
-    upcomingOpeningMeta.setMetadata(openingMeta)
-    upcomingOpeningMeta.setExpectedStart(openingParams.expectedStartTs)
-    upcomingOpeningMeta.setMinApplicationStake(openingParams.stake.toNumber())
-    upcomingOpeningMeta.setRewardPerBlock(openingParams.reward.toNumber())
-
-    addUpcomingOpeningMeta.setMetadata(upcomingOpeningMeta)
-    actionMeta.setAddUpcomingOpening(addUpcomingOpeningMeta)
-
-    return actionMeta
+  protected getActionMetadataBytes(openingParams: UpcomingOpeningParams): Bytes {
+    const openingMetadata = this.getMetadata(openingParams)
+    console.log('OpeningMetadata', openingMetadata)
+    if (!openingMetadata) {
+      // Opening metadata is invalid so we just return the provided bytes
+      return this.getMetadataBytes(openingParams)
+    }
+    return Utils.metadataToBytes(WorkingGroupMetadataAction, {
+      addUpcomingOpening: {
+        metadata: {
+          expectedStart: openingParams.expectedStartTs,
+          minApplicationStake: Long.fromString(openingParams.stake.toString()),
+          rewardPerBlock: Long.fromString(openingParams.reward.toString()),
+          metadata: openingMetadata,
+        },
+      },
+    })
   }
 
   protected assertQueriedUpcomingOpeningsAreValid(
@@ -79,23 +83,31 @@ export class CreateUpcomingOpeningsFixture extends BaseCreateOpeningFixture {
       const openingParams = this.openingsParams[i]
       const qEvent = this.findMatchingQueryNodeEvent(e, qEvents)
       const qUpcomingOpening = qUpcomingOpenings.find((o) => o.createdInEvent.id === qEvent.id)
-      Utils.assert(qUpcomingOpening)
-      assert.equal(new Date(qUpcomingOpening.expectedStart).getTime(), openingParams.expectedStartTs)
-      assert.equal(qUpcomingOpening.group.name, this.group)
-      assert.equal(qUpcomingOpening.rewardPerBlock, openingParams.reward.toString())
-      assert.equal(qUpcomingOpening.stakeAmount, openingParams.stake.toString())
-      assert.equal(qUpcomingOpening.createdAtBlock.number, e.blockNumber)
-      this.assertQueriedOpeningMetadataIsValid(openingParams, qUpcomingOpening.metadata)
-      Utils.assert(qEvent.result.__typename === 'UpcomingOpeningAdded')
-      assert.equal(qEvent.result.upcomingOpeningId, qUpcomingOpening.id)
+      if (!openingParams.expectMetadataFailue) {
+        Utils.assert(qUpcomingOpening)
+        assert.equal(new Date(qUpcomingOpening.expectedStart).getTime(), openingParams.expectedStartTs)
+        assert.equal(qUpcomingOpening.group.name, this.group)
+        assert.equal(qUpcomingOpening.rewardPerBlock, openingParams.reward.toString())
+        assert.equal(qUpcomingOpening.stakeAmount, openingParams.stake.toString())
+        assert.equal(qUpcomingOpening.createdAtBlock.number, e.blockNumber)
+        Utils.assert(qEvent.result.__typename === 'UpcomingOpeningAdded')
+        assert.equal(qEvent.result.upcomingOpeningId, qUpcomingOpening.id)
+        this.assertQueriedOpeningMetadataIsValid(qUpcomingOpening.metadata, this.getMetadata(openingParams))
+      } else {
+        assert.isUndefined(qUpcomingOpening)
+      }
     })
   }
 
   protected assertQueryNodeEventIsValid(qEvent: StatusTextChangedEventFieldsFragment, i: number): void {
+    const openingParams = this.openingsParams[i]
     assert.equal(qEvent.event.type, EventType.StatusTextChanged)
     assert.equal(qEvent.group.name, this.group)
-    assert.equal(qEvent.metadata, Utils.metadataToBytes(this.getActionMetadata(this.openingsParams[i])).toString())
-    assert.equal(qEvent.result.__typename, 'UpcomingOpeningAdded')
+    assert.equal(qEvent.metadata, this.getActionMetadataBytes(openingParams).toString())
+    assert.equal(
+      qEvent.result.__typename,
+      openingParams.expectMetadataFailue ? 'InvalidActionMetadata' : 'UpcomingOpeningAdded'
+    )
   }
 
   async runQueryNodeChecks(): Promise<void> {

+ 10 - 11
tests/integration-tests/src/fixtures/workingGroups/RemoveUpcomingOpeningsFixture.ts

@@ -8,7 +8,8 @@ import { ISubmittableResult } from '@polkadot/types/types/'
 import { StatusTextChangedEventFieldsFragment } from '../../graphql/generated/queries'
 import { EventType } from '../../graphql/generated/schema'
 import { assert } from 'chai'
-import { RemoveUpcomingOpening, WorkingGroupMetadataAction } from '@joystream/metadata-protobuf'
+import { WorkingGroupMetadataAction } from '@joystream/metadata-protobuf'
+import { Bytes } from '@polkadot/types'
 
 export class RemoveUpcomingOpeningsFixture extends BaseWorkingGroupFixture {
   protected upcomingOpeningIds: string[]
@@ -24,8 +25,7 @@ export class RemoveUpcomingOpeningsFixture extends BaseWorkingGroupFixture {
 
   protected async getExtrinsics(): Promise<SubmittableExtrinsic<'promise'>[]> {
     return this.upcomingOpeningIds.map((id) => {
-      const metaBytes = Utils.metadataToBytes(this.getActionMetadata(id))
-      return this.api.tx[this.group].setStatusText(metaBytes)
+      return this.api.tx[this.group].setStatusText(this.getActionMetadataBytes(id))
     })
   }
 
@@ -33,19 +33,18 @@ export class RemoveUpcomingOpeningsFixture extends BaseWorkingGroupFixture {
     return this.api.retrieveWorkingGroupsEventDetails(result, this.group, 'StatusTextChanged')
   }
 
-  protected getActionMetadata(upcomingOpeningId: string): WorkingGroupMetadataAction {
-    const actionMeta = new WorkingGroupMetadataAction()
-    const removeUpcomingOpeningMeta = new RemoveUpcomingOpening()
-    removeUpcomingOpeningMeta.setId(upcomingOpeningId)
-    actionMeta.setRemoveUpcomingOpening(removeUpcomingOpeningMeta)
-
-    return actionMeta
+  protected getActionMetadataBytes(upcomingOpeningId: string): Bytes {
+    return Utils.metadataToBytes(WorkingGroupMetadataAction, {
+      removeUpcomingOpening: {
+        id: upcomingOpeningId,
+      },
+    })
   }
 
   protected assertQueryNodeEventIsValid(qEvent: StatusTextChangedEventFieldsFragment, i: number): void {
     assert.equal(qEvent.event.type, EventType.StatusTextChanged)
     assert.equal(qEvent.group.name, this.group)
-    assert.equal(qEvent.metadata, Utils.metadataToBytes(this.getActionMetadata(this.upcomingOpeningIds[i])).toString())
+    assert.equal(qEvent.metadata, this.getActionMetadataBytes(this.upcomingOpeningIds[i]).toString())
     Utils.assert(qEvent.result.__typename === 'UpcomingOpeningRemoved', 'Unexpected StatuxTextChangedEvent result type')
     assert.equal(qEvent.result.upcomingOpeningId, this.upcomingOpeningIds[i])
   }

+ 25 - 0
tests/integration-tests/src/fixtures/workingGroups/TerminateWorkersFixture.ts

@@ -11,6 +11,7 @@ import { Utils } from '../../utils'
 import { EventType } from '../../graphql/generated/schema'
 import { lockIdByWorkingGroup } from '../../consts'
 import {
+  LeaderUnsetEventFieldsFragment,
   TerminatedLeaderEventFieldsFragment,
   TerminatedWorkerEventFieldsFragment,
   WorkerFieldsFragment,
@@ -103,6 +104,19 @@ export class TerminateWorkersFixture extends BaseWorkingGroupFixture {
     })
   }
 
+  protected assertQueriedLeaderUnsetEventIsValid(
+    eventDetails: EventDetails,
+    qEvent: LeaderUnsetEventFieldsFragment | null
+  ): void {
+    Utils.assert(qEvent, 'Query node: LeaderUnsetEvent not found!')
+    assert.equal(qEvent.event.inExtrinsic, this.extrinsics[0].hash.toString())
+    assert.equal(qEvent.event.inBlock.number, eventDetails.blockNumber)
+    assert.equal(qEvent.event.inBlock.timestamp, eventDetails.blockTimestamp)
+    assert.equal(qEvent.group.name, this.group)
+    assert.equal(qEvent.event.type, EventType.LeaderUnset)
+    assert.equal(qEvent.leader.runtimeId, this.workerIds[0].toNumber())
+  }
+
   async runQueryNodeChecks(): Promise<void> {
     await super.runQueryNodeChecks()
 
@@ -118,5 +132,16 @@ export class TerminateWorkersFixture extends BaseWorkingGroupFixture {
     // Check workers
     const qWorkers = await this.query.getWorkersByIds(this.workerIds, this.group)
     this.assertQueriedWorkersAreValid(qEvents, qWorkers)
+
+    // If lead - check LeaderUnset event
+    if (this.asSudo) {
+      const leaderUnsetEvent = await this.api.retrieveWorkingGroupsEventDetails(
+        this.results[0],
+        this.group,
+        'LeaderUnset'
+      )
+      const qEvent = await this.query.getLeaderUnsetEvent(leaderUnsetEvent)
+      this.assertQueriedLeaderUnsetEventIsValid(leaderUnsetEvent, qEvent)
+    }
   }
 }

+ 13 - 26
tests/integration-tests/src/fixtures/workingGroups/UpdateGroupStatusFixture.ts

@@ -7,24 +7,20 @@ import { SubmittableExtrinsic } from '@polkadot/api/types'
 import { ISubmittableResult } from '@polkadot/types/types/'
 import { Utils } from '../../utils'
 import { EventType } from '../../graphql/generated/schema'
-import { SetGroupMetadata, WorkingGroupMetadata, WorkingGroupMetadataAction } from '@joystream/metadata-protobuf'
+import { IWorkingGroupMetadata, WorkingGroupMetadataAction } from '@joystream/metadata-protobuf'
 import {
   StatusTextChangedEventFieldsFragment,
   WorkingGroupFieldsFragment,
   WorkingGroupMetadataFieldsFragment,
 } from '../../graphql/generated/queries'
 import _ from 'lodash'
+import { Bytes } from '@polkadot/types'
 
 export class UpdateGroupStatusFixture extends BaseWorkingGroupFixture {
-  protected updates: WorkingGroupMetadata.AsObject[]
+  protected updates: IWorkingGroupMetadata[]
   protected areExtrinsicsOrderSensitive = true
 
-  public constructor(
-    api: Api,
-    query: QueryNodeApi,
-    group: WorkingGroupModuleName,
-    updates: WorkingGroupMetadata.AsObject[]
-  ) {
+  public constructor(api: Api, query: QueryNodeApi, group: WorkingGroupModuleName, updates: IWorkingGroupMetadata[]) {
     super(api, query, group)
     this.updates = updates
   }
@@ -35,8 +31,7 @@ export class UpdateGroupStatusFixture extends BaseWorkingGroupFixture {
 
   protected async getExtrinsics(): Promise<SubmittableExtrinsic<'promise'>[]> {
     return this.updates.map((update) => {
-      const metaBytes = Utils.metadataToBytes(this.getActionMetadata(update))
-      return this.api.tx[this.group].setStatusText(metaBytes)
+      return this.api.tx[this.group].setStatusText(this.getActionMetadataBytes(update))
     })
   }
 
@@ -44,26 +39,18 @@ export class UpdateGroupStatusFixture extends BaseWorkingGroupFixture {
     return this.api.retrieveWorkingGroupsEventDetails(r, this.group, 'StatusTextChanged')
   }
 
-  protected getActionMetadata(update: WorkingGroupMetadata.AsObject): WorkingGroupMetadataAction {
-    const actionMeta = new WorkingGroupMetadataAction()
-    const setGroupMeta = new SetGroupMetadata()
-    const newGroupMeta = new WorkingGroupMetadata()
-
-    newGroupMeta.setAbout(update.about!)
-    newGroupMeta.setDescription(update.description!)
-    newGroupMeta.setStatus(update.status!)
-    newGroupMeta.setStatusMessage(update.statusMessage!)
-
-    setGroupMeta.setNewMetadata(newGroupMeta)
-    actionMeta.setSetGroupMetadata(setGroupMeta)
-
-    return actionMeta
+  protected getActionMetadataBytes(update: IWorkingGroupMetadata): Bytes {
+    return Utils.metadataToBytes(WorkingGroupMetadataAction, {
+      setGroupMetadata: {
+        newMetadata: update,
+      },
+    })
   }
 
   protected assertQueryNodeEventIsValid(qEvent: StatusTextChangedEventFieldsFragment, i: number): void {
     assert.equal(qEvent.event.type, EventType.StatusTextChanged)
     assert.equal(qEvent.group.name, this.group)
-    assert.equal(qEvent.metadata, Utils.metadataToBytes(this.getActionMetadata(this.updates[i])).toString())
+    assert.equal(qEvent.metadata, this.getActionMetadataBytes(this.updates[i]).toString())
     assert.equal(qEvent.result.__typename, 'WorkingGroupMetadataSet')
   }
 
@@ -81,7 +68,7 @@ export class UpdateGroupStatusFixture extends BaseWorkingGroupFixture {
     eventDetails: EventDetails,
     preUpdateSnapshot: WorkingGroupMetadataFieldsFragment | null,
     postUpdateSnapshot: WorkingGroupMetadataFieldsFragment | null,
-    update: WorkingGroupMetadata.AsObject
+    update: IWorkingGroupMetadata
   ): asserts postUpdateSnapshot is WorkingGroupMetadataFieldsFragment {
     if (!postUpdateSnapshot) {
       throw new Error('Query node: WorkingGroupMetadata snapshot not found!')

+ 3 - 6
tests/integration-tests/src/fixtures/workingGroups/utils.ts

@@ -1,15 +1,12 @@
 import { OpeningMetadata } from '@joystream/metadata-protobuf'
 import { ApplicationFormQuestionType } from '../../graphql/generated/schema'
 
-type InputTypeMap = OpeningMetadata.ApplicationFormQuestion.InputTypeMap
-const InputType = OpeningMetadata.ApplicationFormQuestion.InputType
-
 export const queryNodeQuestionTypeToMetadataQuestionType = (
   type: ApplicationFormQuestionType
-): InputTypeMap[keyof InputTypeMap] => {
+): OpeningMetadata.ApplicationFormQuestion.InputType => {
   if (type === ApplicationFormQuestionType.Text) {
-    return InputType.TEXT
+    return OpeningMetadata.ApplicationFormQuestion.InputType.TEXT
   }
 
-  return InputType.TEXTAREA
+  return OpeningMetadata.ApplicationFormQuestion.InputType.TEXTAREA
 }

+ 18 - 2
tests/integration-tests/src/flows/working-groups/groupStatus.ts

@@ -4,13 +4,13 @@ import { UpdateGroupStatusFixture } from '../../fixtures/workingGroups'
 import Debugger from 'debug'
 import { FixtureRunner } from '../../Fixture'
 import { workingGroups } from '../../consts'
-import { WorkingGroupMetadata } from '@joystream/metadata-protobuf'
+import { IWorkingGroupMetadata } from '@joystream/metadata-protobuf'
 import _ from 'lodash'
 
 export default async function groupStatus({ api, query, env }: FlowProps): Promise<void> {
   await Promise.all(
     workingGroups.map(async (group) => {
-      const updates: WorkingGroupMetadata.AsObject[] = [
+      const updates: IWorkingGroupMetadata[] = [
         { description: `${_.startCase(group)} Test Description`, about: `${_.startCase(group)} Test About Text` },
         {
           status: 'Testing',
@@ -26,7 +26,23 @@ export default async function groupStatus({ api, query, env }: FlowProps): Promi
         {
           about: `${_.startCase(group)} New Test About`,
         },
+        // Some edge cases:
+        // Should not change anything:
         {},
+        // Should not change anything:
+        {
+          status: null,
+          statusMessage: null,
+          about: null,
+          description: null,
+        },
+        // Should change everything to empty strings:
+        {
+          status: '',
+          statusMessage: '',
+          about: '',
+          description: '',
+        },
         {
           status: 'Testing finished',
           statusMessage: '',

+ 22 - 1
tests/integration-tests/src/flows/working-groups/upcomingOpenings.ts

@@ -4,6 +4,7 @@ import { CreateUpcomingOpeningsFixture, RemoveUpcomingOpeningsFixture } from '..
 import Debugger from 'debug'
 import { FixtureRunner } from '../../Fixture'
 import { workingGroups } from '../../consts'
+import { UpcomingOpeningParams } from '../../fixtures/workingGroups/BaseCreateOpeningFixture'
 
 export default async function upcomingOpenings({ api, query, env }: FlowProps): Promise<void> {
   await Promise.all(
@@ -12,7 +13,27 @@ export default async function upcomingOpenings({ api, query, env }: FlowProps):
       debug('Started')
       api.enableDebugTxLogs()
 
-      const createUpcomingOpeningFixture = new CreateUpcomingOpeningsFixture(api, query, group)
+      const upcomingOpeningsParams: Partial<UpcomingOpeningParams>[] = [
+        // All defaults case:
+        {},
+        // Invalid metadata case:
+        {
+          metadata: '0xff',
+          expectMetadataFailue: true,
+        },
+        // Edge-case valid metadata:
+        {
+          metadata: {
+            shortDescription: '',
+            description: '',
+            expectedEndingTimestamp: 0,
+            hiringLimit: 0,
+            applicationDetails: '',
+            applicationFormQuestions: [],
+          },
+        },
+      ]
+      const createUpcomingOpeningFixture = new CreateUpcomingOpeningsFixture(api, query, group, upcomingOpeningsParams)
       await new FixtureRunner(createUpcomingOpeningFixture).runWithQueryNodeChecks()
       const [createdUpcomingOpeningId] = createUpcomingOpeningFixture.getCreatedUpcomingOpeningIds()
 

+ 37 - 0
tests/integration-tests/src/graphql/generated/queries.ts

@@ -660,6 +660,19 @@ export type GetTerminatedLeaderEventsByEventIdsQuery = {
   terminatedLeaderEvents: Array<TerminatedLeaderEventFieldsFragment>
 }
 
+export type LeaderUnsetEventFieldsFragment = {
+  id: string
+  event: EventFieldsFragment
+  group: { name: string }
+  leader: { id: string; runtimeId: number }
+}
+
+export type GetLeaderUnsetEventsByEventIdsQueryVariables = Types.Exact<{
+  eventIds?: Types.Maybe<Array<Types.Scalars['ID']> | Types.Scalars['ID']>
+}>
+
+export type GetLeaderUnsetEventsByEventIdsQuery = { leaderUnsetEvents: Array<LeaderUnsetEventFieldsFragment> }
+
 export type BudgetSetEventFieldsFragment = {
   id: string
   newBudget: any
@@ -1408,6 +1421,22 @@ export const TerminatedLeaderEventFields = gql`
   }
   ${EventFields}
 `
+export const LeaderUnsetEventFields = gql`
+  fragment LeaderUnsetEventFields on LeaderUnsetEvent {
+    id
+    event {
+      ...EventFields
+    }
+    group {
+      name
+    }
+    leader {
+      id
+      runtimeId
+    }
+  }
+  ${EventFields}
+`
 export const BudgetSetEventFields = gql`
   fragment BudgetSetEventFields on BudgetSetEvent {
     id
@@ -1748,6 +1777,14 @@ export const GetTerminatedLeaderEventsByEventIds = gql`
   }
   ${TerminatedLeaderEventFields}
 `
+export const GetLeaderUnsetEventsByEventIds = gql`
+  query getLeaderUnsetEventsByEventIds($eventIds: [ID!]) {
+    leaderUnsetEvents(where: { eventId_in: $eventIds }) {
+      ...LeaderUnsetEventFields
+    }
+  }
+  ${LeaderUnsetEventFields}
+`
 export const GetBudgetSetEventsByEventIds = gql`
   query getBudgetSetEventsByEventIds($eventIds: [ID!]) {
     budgetSetEvents(where: { eventId_in: $eventIds }) {

+ 9 - 0
tests/integration-tests/src/graphql/generated/schema.ts

@@ -2175,6 +2175,8 @@ export type LeaderUnsetEvent = BaseGraphQlObject & {
   eventId: Scalars['String']
   group: WorkingGroup
   groupId: Scalars['String']
+  leader: Worker
+  leaderId: Scalars['String']
 }
 
 export type LeaderUnsetEventConnection = {
@@ -2186,6 +2188,7 @@ export type LeaderUnsetEventConnection = {
 export type LeaderUnsetEventCreateInput = {
   eventId: Scalars['ID']
   groupId: Scalars['ID']
+  leaderId: Scalars['ID']
 }
 
 export type LeaderUnsetEventEdge = {
@@ -2204,11 +2207,14 @@ export enum LeaderUnsetEventOrderByInput {
   EventIdDesc = 'eventId_DESC',
   GroupIdAsc = 'groupId_ASC',
   GroupIdDesc = 'groupId_DESC',
+  LeaderIdAsc = 'leaderId_ASC',
+  LeaderIdDesc = 'leaderId_DESC',
 }
 
 export type LeaderUnsetEventUpdateInput = {
   eventId?: Maybe<Scalars['ID']>
   groupId?: Maybe<Scalars['ID']>
+  leaderId?: Maybe<Scalars['ID']>
 }
 
 export type LeaderUnsetEventWhereInput = {
@@ -2240,6 +2246,8 @@ export type LeaderUnsetEventWhereInput = {
   eventId_in?: Maybe<Array<Scalars['ID']>>
   groupId_eq?: Maybe<Scalars['ID']>
   groupId_in?: Maybe<Array<Scalars['ID']>>
+  leaderId_eq?: Maybe<Scalars['ID']>
+  leaderId_in?: Maybe<Array<Scalars['ID']>>
 }
 
 export type LeaderUnsetEventWhereUniqueInput = {
@@ -6551,6 +6559,7 @@ export type Worker = BaseGraphQlObject & {
   /** Worker's storage data */
   storage?: Maybe<Scalars['String']>
   leaderseteventworker?: Maybe<Array<LeaderSetEvent>>
+  leaderunseteventleader?: Maybe<Array<LeaderUnsetEvent>>
   memberverificationstatusupdatedeventworker?: Maybe<Array<MemberVerificationStatusUpdatedEvent>>
   newmissedrewardlevelreachedeventworker?: Maybe<Array<NewMissedRewardLevelReachedEvent>>
   stakedecreasedeventworker?: Maybe<Array<StakeDecreasedEvent>>

+ 19 - 1
tests/integration-tests/src/graphql/queries/workingGroupsEvents.graphql

@@ -330,7 +330,25 @@ query getTerminatedLeaderEventsByEventIds($eventIds: [ID!]) {
   }
 }
 
-# TODO: LeaderUnset?
+fragment LeaderUnsetEventFields on LeaderUnsetEvent {
+  id
+  event {
+    ...EventFields
+  }
+  group {
+    name
+  }
+  leader {
+    id
+    runtimeId
+  }
+}
+
+query getLeaderUnsetEventsByEventIds($eventIds: [ID!]) {
+  leaderUnsetEvents(where: { eventId_in: $eventIds }) {
+    ...LeaderUnsetEventFields
+  }
+}
 
 fragment BudgetSetEventFields on BudgetSetEvent {
   id

+ 16 - 2
tests/integration-tests/src/utils.ts

@@ -7,6 +7,15 @@ import { decodeAddress } from '@polkadot/keyring'
 import { Bytes } from '@polkadot/types'
 import { createType } from '@joystream/types'
 
+type AnyMessage<T> = T & {
+  toJSON(): Record<string, unknown>
+}
+
+type AnyMetadataClass<T> = {
+  decode(binary: Uint8Array): AnyMessage<T>
+  encode(obj: T): { finish(): Uint8Array }
+  toObject(obj: AnyMessage<T>): Record<string, unknown>
+}
 export class Utils {
   private static LENGTH_ADDRESS = 32 + 1 // publicKey + prefix
   private static LENGTH_ERA = 2 // assuming mortals
@@ -48,8 +57,13 @@ export class Utils {
     return key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)
   }
 
-  public static metadataToBytes(meta: { serializeBinary(): Uint8Array }): Bytes {
-    return createType('Bytes', '0x' + Buffer.from(meta.serializeBinary()).toString('hex'))
+  public static metadataToBytes<T>(metaClass: AnyMetadataClass<T>, obj: T): Bytes {
+    return createType('Bytes', '0x' + Buffer.from(metaClass.encode(obj).finish()).toString('hex'))
+  }
+
+  public static metadataFromBytes<T>(metaClass: AnyMetadataClass<T>, bytes: Bytes): T {
+    // We use `toObject()` to get rid of .prototype defaults for optional fields
+    return metaClass.toObject(metaClass.decode(bytes.toU8a(true))) as T
   }
 
   public static assert(condition: any, msg?: string): asserts condition {

+ 26 - 9
yarn.lock

@@ -5278,7 +5278,7 @@
   resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.166.tgz#07e7f2699a149219dbc3c35574f126ec8737688f"
   integrity sha512-A3YT/c1oTlyvvW/GQqG86EyqWNrT/tisOIh2mW3YCgcx71TNjiTZA3zYZWA5BCmtsOTXjhliy4c4yEkErw6njA==
 
-"@types/long@^4.0.0":
+"@types/long@^4.0.0", "@types/long@^4.0.1":
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9"
   integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==
@@ -5377,6 +5377,11 @@
   resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.11.tgz#9220ab4b20d91169eb78f456dbfcbabee89dfb50"
   integrity sha512-bwVfNTFZOrGXyiQ6t4B9sZerMSShWNsGRw8tC5DY1qImUNczS9SjT4G6PnzjCnxsu5Ubj6xjL2lgwddkxtQl5w==
 
+"@types/node@^13.7.0":
+  version "13.13.51"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.51.tgz#a424c5282f99fc1ca41f11b727b6aea80668bcba"
+  integrity sha512-66/xg5I5Te4oGi5Jws11PtNmKkZbOPZWyBZZ/l5AOrWj1Dyw+6Ge/JhYTq/2/Yvdqyhrue8RL+DGI298OJ0xcg==
+
 "@types/node@^9.6.4":
   version "9.6.61"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.61.tgz#29f124eddd41c4c74281bd0b455d689109fc2a2d"
@@ -14415,7 +14420,7 @@ google-libphonenumber@^3.1.6, google-libphonenumber@^3.2.8:
   resolved "https://registry.yarnpkg.com/google-libphonenumber/-/google-libphonenumber-3.2.15.tgz#3a01dc554dbf83c754f249c16df3605e5d154bb9"
   integrity sha512-tbCIuzMoH34RdrbFRw5kijAZn/p6JMQvsgtr1glg2ugbwqrMPlOL8pHNK8cyGo9B6SXpcMm4hdyDqwomR+HPRg==
 
-google-protobuf@^3.14.0, google-protobuf@^3.6.1:
+google-protobuf@^3.14.0:
   version "3.15.6"
   resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.15.6.tgz#2048055828530993a51df4d4ca2c08322fc1ec7c"
   integrity sha512-p65NyhIZFHFUxbIPOm6cygg2rCjK+2uDCxruOG3RaWKM9R4rBGX0STmlJoSOhoyAG8Fha7U8FP4pQomAV1JXsA==
@@ -23076,6 +23081,25 @@ proto-list@~1.2.1:
   resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
   integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
 
+protobufjs@^6.10.2:
+  version "6.10.2"
+  resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.2.tgz#b9cb6bd8ec8f87514592ba3fdfd28e93f33a469b"
+  integrity sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==
+  dependencies:
+    "@protobufjs/aspromise" "^1.1.2"
+    "@protobufjs/base64" "^1.1.2"
+    "@protobufjs/codegen" "^2.0.4"
+    "@protobufjs/eventemitter" "^1.1.0"
+    "@protobufjs/fetch" "^1.1.0"
+    "@protobufjs/float" "^1.0.2"
+    "@protobufjs/inquire" "^1.1.0"
+    "@protobufjs/path" "^1.1.2"
+    "@protobufjs/pool" "^1.1.0"
+    "@protobufjs/utf8" "^1.1.0"
+    "@types/long" "^4.0.1"
+    "@types/node" "^13.7.0"
+    long "^4.0.0"
+
 protocol-buffers-schema@^3.3.1:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.4.0.tgz#2f0ea31ca96627d680bf2fefae7ebfa2b6453eae"
@@ -27419,13 +27443,6 @@ ts-pnp@^1.1.2:
   resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
   integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
 
-ts-protoc-gen@^0.14.0:
-  version "0.14.0"
-  resolved "https://registry.yarnpkg.com/ts-protoc-gen/-/ts-protoc-gen-0.14.0.tgz#a6f4c3fc37d1d449915551c18404fb7e9aa8fef6"
-  integrity sha512-2z6w2HioMCMVNcgNHBcEvudmQfzrn+3BjAlz+xgYZ9L0o8n8UG8WUiTJcbXHFiEg2SU8IltwH2pm1otLoMSKwg==
-  dependencies:
-    google-protobuf "^3.6.1"
-
 tsconfig-paths-webpack-plugin@^3.2.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.3.0.tgz#a7461723c20623ca9148621a5ce36532682ad2ff"